From 8b92733bb14947565639eebb8a84538e479aa15e Mon Sep 17 00:00:00 2001 From: achaw Date: Mon, 11 Jul 2016 10:51:41 -0300 Subject: [PATCH 001/126] Create spanish.xml --- resources/language/spanish/spanish.xml | 97 ++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 resources/language/spanish/spanish.xml diff --git a/resources/language/spanish/spanish.xml b/resources/language/spanish/spanish.xml new file mode 100644 index 0000000..220f7db --- /dev/null +++ b/resources/language/spanish/spanish.xml @@ -0,0 +1,97 @@ + + + Lenguaje de Interface + Fijar Vista de Directorio + Desactivado + Directorio de Descarga (no FAT32) + Usar magnet-links + Mantener archivos descargados + Seguir compartiendo (seed) archivos descargados + Limite de velocidad de subida MBits/seg (0 - ilimitado) + Limite de velocidad de bajada MBits/seg (0 - ilimitado) + Usar solo libtorrent + Pre-descargar y reproducir próximo episodio + Descargar metadata para Listas de Contenido + Debug (Modo Desarrollador) + Confluence (por slng) + Transperency (por slng) + Confluence (por DiMartino) + Confluence (por RussakHH) + Activar historial de búsqueda + python-libtorrent + Ace Stream + Reproductor P2P + Rest Settings in Programms - Cliente AceStream + Tiempo de Espera de búsqueda + Corto (10s) + Normal (20s) + Largo (30s) + Pre-descargar subtítulos para todos los directorios + Seguir compartiendo (seed) luego de la reproducción + Preguntar si cambiar almacenamiento antes de reproducir + Eliminar complementos rusos + Devolver complementos rusos + Acción al clickear torrent + Abrir Torrent + Abrir menú contextual + Descargar via cliente torrent + Descargar via python-libtorrent + Ordenar resultado de búsqueda por semillas + Frase opcional para búsqueda customizada + Encriptación + Número de hilo de búsqueda + Eliminar archivos + Guardar Archivos + Preguntar si guardar + Torrent2HTTP (libtorrent via http) + Auto-desbloquear proxy + Ninguno + Anti-zapret + Immunidad + Conexiones Máximas (0 - ilimitadas) + Usar puertos aleatorios + Puerto para conexiones entrantes + Tamaño de pre-buffer anterior a la reproducción (MB) + Auto reproducir próximo episodio (o preguntar) + Configuración de dispositivo + Promedio/Buena PC + Bajo el promedio PC/router + Tamaño de almacenamiento minimo para autolimpieza (GB) + Pausar video despues de iniciar + Ordenar resultados de búsqueda + by Semillas + no ordenar + por Nombre + Do not add to Watched History if played more (%) + Confluence (por safonov_ivan) + Aeon Nox (por joyrider) + pyrrent2http (python-libtorrent via http) + Añadir tamaño al nombre de archivo + Activar DHT + Interfaz + Red P2P + Avanzado + Cliente Torrent + Hentai (sintonia fina) + Ruta de Guardado + Diálogo de Llamado + Por Defecto + Ruta + Crear subdirectorio para scraper + Host + Puerto + URL + Usuario + Password + Cliente Torrent + URL (solamente, No SSL) + Reemplazo de Ruta (solo remoto) + Cerrar + Abrir Configuración + Navegador de Cliente Torrent + Instalar trackers + Configuración de trackers + Limpiar almacenamiento + Elegir buscador + No tienes buscador externo. Por favor instala uno. + From 65e7f8f980993922c64d89fe479a3a0c206490eb Mon Sep 17 00:00:00 2001 From: achaw Date: Wed, 13 Jul 2016 09:49:55 -0300 Subject: [PATCH 002/126] Update Localization.py --- Localization.py | 261 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 260 insertions(+), 1 deletion(-) diff --git a/Localization.py b/Localization.py index ff2fd79..d802497 100644 --- a/Localization.py +++ b/Localization.py @@ -23,7 +23,7 @@ try: __settings__ = xbmcaddon.Addon(id='plugin.video.torrenter') - language = ('en', 'ru', 'uk','he')[int(__settings__.getSetting("language"))] + language = ('en', 'ru', 'uk','he', 'es')[int(__settings__.getSetting("language"))] except: language = 'ru' @@ -31,6 +31,265 @@ except: def localize(text): dictionary = { + 'es': { + 'Seeds searching.': 'Búsqueda de seeds', + 'Please Wait': 'Por favor espere', + 'Information': 'Información', + 'Torrent downloading is stopped.': 'La descarga del torrent se detuvo', + 'Search': 'Buscar', + 'Seeds': 'Seeds', + 'Peers': 'Peers', + 'Materials are loading now.': 'Los materiales estan cargando', + 'Search Phrase': 'Expresión de búsqueda', + 'Magnet-link is converting': 'El Link Magnetico se esta convirtiendo', + 'Error': 'Error', + 'Your library out of date and can\'t save magnet-links.': 'Tu Colección es antigüa y no puede guardar links magneticos ', + 'Bookmarks': 'Favoritos', + 'Logout': 'Salir', + 'Login': 'Login', + 'Recent Materials': 'Materiales recientes ', + 'Register': 'Registrar', + 'Bookmark': 'Favorito', + 'Item successfully added to Bookmarks': 'El ítem se ha añadido a Favoritos', + 'Item successfully removed from Bookmarks': 'El ítem se ha eliminado de Favoritos', + 'Bookmark not added': 'El favorito no se ha añadido', + 'Bookmark not removed': 'El favorito no se ha eliminado', + 'Add To Bookmarks': 'Añadir a favoritos', + 'Remove From Bookmarks': 'Eliminar de favoritos', + 'Auth': 'Autenticación', + 'Already logged in': 'Acgtualmente autenticado', + 'Input Email (for password recovery):': 'Ingrese Email (para recuperación de contraseña):', + 'Input Email:': 'Ingrese Email:', + 'Input Password (6+ symbols):': 'Ingrese Password (6+ carateres):', + 'Input Password:': 'Ingrese Password', + 'Login successfull': 'Autenticación exitosa', + 'Login failed': 'Falló la autenticación', + 'User not logged in': 'Usuario no autenticado', + 'User successfully logged out': 'El usuario ha salido con éxito', + 'Preloaded: ': 'Pre-carga', + 'Do you want to STOP torrent downloading and seeding?': 'Desea detener la descarga del torrent y el seeding?', + 'Torrent Downloading': 'Descarga de torrent', + 'Auth expired, please relogin': 'Autenticación expirada, por favor vuelva a ingresar', + 'Storage': 'Almacenamiento', + 'Storage has been cleared': 'El almacenamiento se ha limpiado', + 'Clear Storage': 'Limpiar almacenamiento', + 'Popular': 'Popular', + 'Views': 'Vistas', + 'Uploading': 'Subida', + 'Download': 'Descarga', + 'Input symbols from CAPTCHA image:': 'Ingrese los simpobos de la CAPTCHA:', + 'Please, rate watched video:': 'Por favor, valore el video que acaba de ver:', + 'Bad': 'Malo', + 'So-So': 'Ni fu Ni fa', + 'Good': 'Bueno', + 'Ratings': 'Valoraciones', + 'Rating': 'Valoración', + 'Retry': 'Reintentar', + '%ds has left': '%ds ha dejado', + 'File failed to play! Do you want to RETRY and buffer more?': 'Falló la reproducción! Desea reintentar y aumentar el buffer?', + 'High Priority Files': 'Archivos de alta prioridad', + 'Skip All Files': 'Omitir todos los archivos', + 'Start': 'Iniciar', + 'Stop': 'Detener', + 'Play':'Reproducir', + 'High Priority': 'Alta prioridad', + 'Skip File': 'Omitir archivo', + 'Remove': 'Eliminar', + 'Remove with files': 'Eliminar (con archivos)', + 'Play File': 'Reproducir Archivo', + 'Start All Files': 'Iniciar todos los archivos', + 'Stop All Files': 'Detener todos los archivos', + 'Torrent-client Browser': 'Navegador de Cliente Torrent', + 'Remote Torrent-client': 'Cliente de Torrent remoto', + 'You didn\'t set up replacement path in setting.': 'No ha configurado una ruta de reemplazo en la configuración.', + 'For example /media/dl_torr/ to smb://SERVER/dl_torr/. Setup now?': 'Por ejemplo /media/dl_torr/ a smb://SERVER/dl_torr/. Desea configurarla ahora?', + 'Manual Torrent-client Path Edit': 'Edicion manual de la ruta del cliente torrent', + 'Choose .torrent in video library': 'Elija el .torrent en la Colección de Video', + '.torrent Player': 'Reproductor de .torrent', + 'Choose directory:': 'Elegir directorio:', + 'Starting download next episode!': 'Comenzando a descargar el próximo episodio!', + 'Choose in torrent-client:': 'Elija cliente torrent', + 'Search Control Window': 'Centro de Control de Busqueda', + 'Magnet-link (magnet:...)': 'Link Magnetico (magnet:...)', + 'Not a magnet-link!': 'No es un link magnetico', + 'Magnet-link Player': 'Reproductor de link magnetico', + 'UNKNOWN STATUS': 'ESTADO DESCONOCIDO', + 'Checking preloaded files...': 'Chequeando archivos pre-cargados', + 'Waiting for website response...': 'Esperando respuesta del sitio---', + 'Search and cache information for:': 'Buscar y cachear información para:', + 'Open Torrent': 'Abrir Torrent', + 'Torrent list is empty.': 'La lista de torrent esta vacía', + 'Content Lists': 'Listas de Contenido', + 'Canceled by User': 'Cancelado por el Usuario', + 'Do you want to search and cache full metadata + arts?': 'Desea bucar y cachear el arte+ metadata por completo?', + 'This vastly decreases load speed, but you will be asked to download premade bases!': 'Esto incrementará la velocidad de carga, pero se le pregutnará si descargar premade bases!', + 'Do you want to preload full metadata?': 'Desea pre-cargar metadata por completo?', + 'It is highly recommended!': 'מומלץ', + 'TV Shows': 'Series de TV', + 'Cartoons': 'Cartoons', + 'Anime': 'Anime', + 'Most Recent': 'Mas Recientes', + 'Top 250 Movies': 'Películas Top 250', + 'Top All Time': 'Top Histórico', + 'by Genre': 'por Género', + 'by Year': 'por Año', + 'Action': 'Acción', + 'Adventure': 'Aventura', + 'Animation': 'Animación', + 'Biography': 'Biografía', + 'Comedy': 'Comedia', + 'Crime': 'Policial', + 'Documentary': 'Docuemntal', + 'Drama': 'Drama', + 'Family': 'Familiar', + 'Fantasy': 'Fantasía', + 'Film-Noir': 'Film-Noir', + 'History': 'Historia', + 'Horror': 'Terror', + 'Music': 'Música', + 'Musical': 'Musical', + 'Mystery': 'Misterio', + 'Romance': 'Romance', + 'Sci-Fi': 'Ciencia Ficción', + 'Short': 'Cortos', + 'Sport': 'Deportes', + 'Thriller': 'Thriller', + 'War': 'Bélicas', + 'Western': 'Western', + '[B]by Site[/B]': '[B]por Sitio[/B]', + 'Cartoons Series': 'Series de Carrtons', + 'Cartoons Short': 'Series de Cortos', + 'Male': 'Masculino', + 'Female': 'Femenino', + 'Russia & USSR': 'Rusia & USSR', + 'Next Page': 'Página Siguiente', + 'Previous Page': 'Página Enterior', + 'Russian Movies': 'Películas Rusas', + 'israeli Movies': 'Películas Israelies', + 'hebdub movies': 'peliculas hebdub', + 'Movies': 'Películas', + 'High Resolution Movies': 'Peliculas en HD', + '3D Movies': 'Películas en 3D', + 'Movies [Bluray]': 'Películas [Bluray]', + 'Anime Film': 'Películas Anime', + 'Anime Series': 'Series Anime', + 'Can\'t download torrent, probably no seeds available.': 'No se puede descargar el torrent, probablemente no halla seed disponibles.', + 'Personal List': 'Lista Personal', + 'Add to %s': 'Añadir a %s', + 'Delete from %s': 'Eliminar de %s', + 'Added!': 'Añadido!', + 'Deleted!': 'Eliminado!', + 'Search History': 'Historial de búsqueda', + ' History ':' Historial ', + 'Torrent History':'Historial de Torrent', + 'Watched History':'Historial de Vistos', + 'Favourites': 'Favoritos', + 'Favourites SH': 'Favoritos SH', + 'Clear %s': 'Limpiar %s', + 'Clear!': 'Limpieza exitosa!', + 'kb/s': 'kb/s', + 'Queued': 'En Cola', + 'Checking': 'Chequeando', + 'Downloading metadata': 'Descargando Metadata', + 'Downloading': 'Descargado', + 'Finished': 'Finalizado', + 'Seeding': 'Compartiendo', + 'Allocating': 'Asignando', + 'Allocating file & Checking resume': 'Asignando archivo & chequeando resumen', + 'For Kids': 'Para Niños', + 'Adult': 'Adultos', + 'Does not support magnet links!': 'No soporta Links Magneticos!', + 'Reset All Cache DBs': 'Resetear el cache de las BD', + '[B]Search[/B]': '[B]Buscar[/B]', + 'You can always restart this by deleting DBs via Context Menu': 'Siempre puedes reiniciar esto eliminando las DB en el menú contextual', + 'Your preloaded databases are outdated!': 'Tus Base de Datos precargadas son demasiado antigüas!', + 'Do you want to download new ones right now?': 'Desea descargar ahora versiones mas recientes?', + 'Individual Tracker Options':'Opciones Individuales de Tracker', + 'Downloading and copy subtitles. Please wait.':'Descargando y copiando subtitulos. Por favor espere.', + 'International Check - First Run':'Chequeo Internacional. Primera ejecución.', + 'Delete Russian stuff?':'Eliminar artículos rusos?', + 'Save to path':'Guardar a directorio', + 'Return Russian stuff':'Devolver artículos rusos', + '%d files have been returned':'%d archivos fueron devueltos', + 'Download via T-client':'Descargar via Cliente-T', + 'Download via Libtorrent':'Descargar via Libtorrent', + 'Download Status':'Estado de Descarga', + 'Download has not finished yet':'La descarga aun no ha finalizado, + 'Stopped and Deleted!':'Detenido y Eliminado', + 'Unpaused!':'De-pausado', + 'Paused!':'Pausado', + 'Stopped!':'Detenido', + 'Started!':'Iniciado', + 'Delete and Stop':'Eliminado y detenido', + 'Unpause':'Des-pausar', + 'Pause':'Pausar', + 'Delete':'Eliminar', + 'Open (no return)':'Abrir (sin retorno)', + 'Torrent is seeding. To stop it use Download Status.':'El toorrent esta siendo compartido. Para detenerlo, utiliza el dialogo de descarga.', + 'Start All':'Iniciar Todo', + 'Started All!':'Todo ha sido iniciado', + 'Stopped All!':'Todo ha sido detenido', + 'Stop All':'Detener todo', + 'Keyboard':'Teclado', + 'Copy Files in Root':'Copiar archivos en la Raiz del sistema', + 'Copied %d files!':'Se han copiado %d archivos!', + 'Add to MyShows.ru':'Añadir a MyShows.ru', + 'Return to MyShows.ru':'Retornar a MyShows.ru', + 'Search results:':'Resultados de búsqueda', + 'by Seeders':'por Seeders', + 'by Date':'por fecha', + 'Sort':'Orden', + 'Close':'Cerrar', + 'Views:':'Vistas:', + 'Rating:':'Valoración:', + 'Information not found!':'Información no encontrada', + 'Choose searcher':'Elija Buscador', + 'python-libtorrent Not Found':'python-libtorrent no encontrado', + 'Windows has static compiled python-libtorrent included.':'Windows ya incluye una version de python-libtorrent compilada estáticamente', + 'You should install "script.module.libtorrent" from "MyShows.me Kodi Repo"':'Debes instalar "script.module.libtorrent" de "MyShows.me Kodi Repo', + 'Linux x64 has not static compiled python-libtorrent included.':'Linux x64 no incluye una version de python-libtorrent compilada estáticamente', + 'You should install it by "sudo apt-get install python-libtorrent"':'Debes instalarlo con el comando "sudo apt-get install python-libtorrent"', + 'Linux has static compiled python-libtorrent included but it didn\'t work.':'Linux x86 ya incluye una version de python-libtorrent compilada estáticamente, pero no funciónó', + 'As far as I know you can compile python-libtorrent for ARMv6-7.':'Creo que puede compilar python-libtorrent para ARMv6-7.', + 'You should search for "OneEvil\'s OpenELEC libtorrent" or use Ace Stream.':'Deberias buscar "OneEvil\'s OpenELEC libtorrent" o usar Ace Stream', + 'Please use install Ace Stream APK and choose it in Settings.':'Por favor instala Ace Stream APK y seleccionalo en la configuración', + 'It is possible to compile python-libtorrent for Android, but I don\'t know how.':'Es posible compilar python-libtorrent en Android pero desconozco el procedimiento.', + 'It is possible to compile python-libtorrent for OS X.':'Es posible compilar python-libtorrent para OS X.', + 'But you would have to do it by yourself, there is some info on github.com.':'Pero debes hacerlo por tu cuenta, hay información en github.com.', + 'It is NOT possible to compile python-libtorrent for iOS.':'No es posible compilar python-libtorrent para iOS', + 'But you can use torrent-client control functions.':'Pero puedes usar las funciones del cliente torrent', + 'I added custom searchers to Torrenter v2!':'He añadido buscadores personalizados a Torrenter v2!', + 'Now you can use your login on trackers or write and install your own searcher!':'Ahora puedes usar tus datos para loguearte en trackers o escribir e instalar tu propio buscador!', + 'Would you like to install %s from "MyShows.me Kodi Repo" in Programs section?':'Deseas instalar %s de "MyShows.me Kodi Repo" en la sección de Programas?', + 'Open installation window?':'Abrir ventana de instalación?', + 'Android Support':'Soporte Android', + 'Android has no temprorary folder':'Android no contiene directorio temporal', + 'Please specify storage folder in Settings!':'Por favor especifica el directorio de descarga en la configuración!', + 'You have no installed or active searchers! More info in Search Control Window!':'No has instalado o activado ningun buscador! Mas info en el Centro de Control de Búsquedas', + 'Please contact DiMartino on kodi.tv forum. We compiled python-libtorrent for Android,':'Por favor contacta a DiMartino en el foro kodi.tv. Hemos compilado python-libtorrent para Android,', + 'but we need your help with some Torrent is seeding. To stop it use Download Status.s on different processors.':'pero necesitamos tu ayuda cuando el torrent esta siendo compartido. Para detenerlo, usa el estado de descarga según el procesador.', + 'We added Android ARM full support to Torrenter v2!':'Hemos añadido soporte completo de Torrenter v2 para Android ARM!', + 'I deleted pre-installed ones, install them in Search Control Window!':'Se han eliminado los preintalados, instalalos desde el Centro de Control de Búsquedas!', + 'Torrenter didn\'t find %s searcher':'Torrenter no encontró el buscador %s', + 'Torrenter Tracker Install':'Intalacion de Tracker de Torrenter', + 'Ask to save':'Preguntar si guardar', + 'Would you like to save this file?':'Desea guardar este archivo?', + 'Your storage path is not writable or not local! Please change it in settings!':'Su ruta de descarga esta protegida contra escritura o no es local. Por favor cambiala en la configuración!', + 'Upgrade advancedsettings.xml':'Actualizar advancedsettings.xml', + 'We would like to set some advanced settings for you!':'Nos gustaría configurar advanced settings en tu equipo!', + 'Do it!':'Hazlo!', + 'Please, restart Kodi now!':'Por favor, reinicia Kodi ahora', + './ (Root folder)':'./ (Directorio Raíz)', + 'Opening torrent file':'Abriendo archivo Torrent', + 'New player to Torrenter v2 - Torrent2HTTP! It should be faster, stable and better with Android, also seeking works in it.':'Nuevo reproductor para Torrenter v2 - Torrent2HTTP: Es más rápido, estable y mejora la compatibilidad con Android. También funciona la búsqueda.', + 'Would you like to try it?':'Desea probarlo?', + 'Torrent2HTTP enabled! Can be changed in Settings.':'Torrent2HTTP se ha activado! Puede cambiarlo en la configuración.', + 'Seeking':'Buscando', + 'Would you like to resume from %s?':'Desea continuar la reproducción desde %s?', + 'Seeking is working only with player Torrent2HTTP.':'La búsqueda solo funciona con el reproductor Torrent2HTTP.', + 'Play (from %s)':'Reproducir (desde %s)', + 'Play (from start)':'Reproducir (desde el inicio)', + }, 'he': { 'Seeds searching.': 'חיפוש זורעים', 'Please Wait': 'המתן', From 038b321a33843b996f421501e1273a488ee7a6f0 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Wed, 13 Jul 2016 18:30:44 +0300 Subject: [PATCH 003/126] spanish --- resources/settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/settings.xml b/resources/settings.xml index 43c2b1d..7bde912 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -1,6 +1,6 @@  - + From bad82f3153f9ca048802657a55b1d1c40d520d14 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Thu, 14 Jul 2016 17:54:25 +0300 Subject: [PATCH 004/126] fix for spanish hacker --- Localization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Localization.py b/Localization.py index d802497..ee1b082 100644 --- a/Localization.py +++ b/Localization.py @@ -214,7 +214,7 @@ def localize(text): 'Download via T-client':'Descargar via Cliente-T', 'Download via Libtorrent':'Descargar via Libtorrent', 'Download Status':'Estado de Descarga', - 'Download has not finished yet':'La descarga aun no ha finalizado, + 'Download has not finished yet':'La descarga aun no ha finalizado', 'Stopped and Deleted!':'Detenido y Eliminado', 'Unpaused!':'De-pausado', 'Paused!':'Pausado', From 2425c921c9ae73a0befa83df3afb7c96d6e089a6 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Fri, 22 Jul 2016 21:47:37 +0300 Subject: [PATCH 005/126] domain fix --- resources/contenters/ThePirateBaySe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/contenters/ThePirateBaySe.py b/resources/contenters/ThePirateBaySe.py index 2cf0d48..e1eecc1 100644 --- a/resources/contenters/ThePirateBaySe.py +++ b/resources/contenters/ThePirateBaySe.py @@ -45,7 +45,7 @@ class ThePirateBaySe(Content.Content): 'heb_movies': ('סרטים מדובבים', '/search/Hebrew-dubbed/0/7/0'), } - baseurl = "thepiratebay.rs" + baseurl = "thepiratebay.ae" headers = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124' + \ ' YaBrowser/14.10.2062.12061 Safari/537.36'), From bef19d8c900550561ab65b159bf5d39b92e54ed6 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Fri, 22 Jul 2016 22:32:57 +0300 Subject: [PATCH 006/126] domain fix --- resources/contenters/KickAssSo.py | 2 +- resources/contenters/ThePirateBaySe.py | 65 +++++++++++------------ resources/contenters/{ => unused}/EZTV.py | 2 +- 3 files changed, 33 insertions(+), 36 deletions(-) rename resources/contenters/{ => unused}/EZTV.py (98%) diff --git a/resources/contenters/KickAssSo.py b/resources/contenters/KickAssSo.py index b5aee44..35dd2c9 100644 --- a/resources/contenters/KickAssSo.py +++ b/resources/contenters/KickAssSo.py @@ -48,7 +48,7 @@ class KickAssSo(Content.Content): } - baseurl = "http://kat.cr" + baseurl = "http://kat.am" headers = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124' + \ ' YaBrowser/14.10.2062.12061 Safari/537.36'), diff --git a/resources/contenters/ThePirateBaySe.py b/resources/contenters/ThePirateBaySe.py index e1eecc1..3294f7f 100644 --- a/resources/contenters/ThePirateBaySe.py +++ b/resources/contenters/ThePirateBaySe.py @@ -23,6 +23,7 @@ import Content class ThePirateBaySe(Content.Content): + # debug = log category_dict = { 'tvshows': ('TV Shows', '/browse/205', {'page': '/browse/208/%d', 'increase': 1, 'second_page': 1, 'sort': [{'name': 'by Seeders', 'url_after': '/0/7/0'}, @@ -45,11 +46,11 @@ class ThePirateBaySe(Content.Content): 'heb_movies': ('סרטים מדובבים', '/search/Hebrew-dubbed/0/7/0'), } - baseurl = "thepiratebay.ae" + baseurl = "http://thepiratebay.ae" headers = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124' + \ ' YaBrowser/14.10.2062.12061 Safari/537.36'), - ('Referer', 'http://kickass.so/'), ('Accept-Encoding', 'gzip')] + ('Referer', 'http://thepiratebay.ae/'), ('Accept-Encoding', 'gzip')] ''' Weight of source with this searcher provided. Will be multiplied on default weight. @@ -82,7 +83,8 @@ class ThePirateBaySe(Content.Content): contentList = [] url = self.get_url(category, subcategory, apps_property) - response = self.open2(url) + import requests + response = requests.get(url).text if None != response and 0 < len(response): # print response @@ -91,40 +93,35 @@ class ThePirateBaySe(Content.Content): # print str(contentList) return contentList - def open2(self, url=''): - import httplib - conn = httplib.HTTPConnection(self.baseurl) - conn.request("GET", url.replace(self.baseurl,'')) - r1 = conn.getresponse() - status = str(r1.status) + " " + r1.reason - content = r1.read() - #print str(status) - #print str(content) - return content - def mode(self, response): contentList = [] - # print str(result) + self.debug = self.log num = 31 - result = re.compile( - r'''
.+?">(.+?).+?Uploaded (.+?), Size (.+?), .+?.+?(\d+?).+?(\d+?)''', - re.DOTALL).findall(response) - for title, link, date, size, seeds, leechers in result: - info = {} - num = num - 1 - original_title = None - year = 0 - img = '' - size = size.replace(' ', ' ') - date = self.stripHtml(date.replace(' ', ' ')) + self.debug(response) + regex = '''.+?''' + regex_tr = r'
.+?">(.+?).+?Uploaded (.+?), Size (.+?), .+?.+?(\d+?).+?(\d+?)' + for tr in re.compile(regex, re.DOTALL).findall(response): + result = re.compile(regex_tr, re.DOTALL).findall(tr) + self.debug(tr + ' -> ' + str(result)) + if result: + (title, link, date, size, seeds, leechers) = result[0] - # info + info = {} + num = num - 1 + original_title = None + year = 0 + img = '' + size = size.replace(' ', ' ') + date = self.stripHtml(date.replace(' ', ' ')) - info['label'] = info['title'] = self.unescape(title) - info['link'] = link - info['plot'] = info['title'] + '\r\n[I](%s) [S/L: %s/%s] [/I]\r\n%s' % (size, seeds, leechers, date) - contentList.append(( - int(int(self.sourceWeight) * (int(num))), - original_title, title, int(year), img, info, - )) + # info + + info['label'] = info['title'] = self.unescape(title) + info['link'] = link + self.log(info['link']) + info['plot'] = info['title'] + '\r\n[I](%s) [S/L: %s/%s] [/I]\r\n%s' % (size, seeds, leechers, date) + contentList.append(( + int(int(self.sourceWeight) * (int(num))), + original_title, title, int(year), img, info, + )) return contentList diff --git a/resources/contenters/EZTV.py b/resources/contenters/unused/EZTV.py similarity index 98% rename from resources/contenters/EZTV.py rename to resources/contenters/unused/EZTV.py index 8cf2e13..5396b8c 100644 --- a/resources/contenters/EZTV.py +++ b/resources/contenters/unused/EZTV.py @@ -28,7 +28,7 @@ class EZTV(Content.Content): 'hot': ('Most Recent', '/', {'page': '/page_%d', 'increase': 1, 'second_page': 1}), } - baseurl = "https://eztv.ch" + baseurl = "https://eztv.ag" headers = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124' + \ ' YaBrowser/14.10.2062.12061 Safari/537.36'), From 81c797c1c2ddb34e52d3953385040c85622177cd Mon Sep 17 00:00:00 2001 From: plasticfighter Date: Wed, 14 Sep 2016 19:30:42 +0200 Subject: [PATCH 007/126] Create strings.xml (Hungarian translation) --- resources/language/Hungarian/strings.xml | 97 ++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 resources/language/Hungarian/strings.xml diff --git a/resources/language/Hungarian/strings.xml b/resources/language/Hungarian/strings.xml new file mode 100644 index 0000000..31f3f9e --- /dev/null +++ b/resources/language/Hungarian/strings.xml @@ -0,0 +1,97 @@ + + + Kezelőfelület nyelve + Mappák nézetének lezárása + Ki + Fájlok mentése mappába (nem FAT32) + Magnet-linkek használata + Letöltött fájlok megtartása + Letöltött fájlok seedben tartása + Feltöltési sebességkorlát MBits/sec (0 - korlátlan) + Letöltési sebességkorlát MBits/sec (0 - korlátlan) + Csak rendszerszintű libtorrent használata + A következő epizód előtöltése és lejátszása + Metaadatok letöltése a Tartalmak Listájába + Hibakeresés (Fejlesztői Mód) + Confluence (by slng) + Transperency (by slng) + Confluence (by DiMartino) + Confluence (by RussakHH) + Keresési Előzmények engedélyezése + python-libtorrent + Ace Stream + P2P Lejátszó + Egyéb beállítások a programban - AceStream Client + Keresés időkorlátja + Rövid (10s) + Normál (20s) + Hosszú (30s) + Feliratok előtöltése az összes mappából + Seedben tartás megtekintés után + Kérdezzen rá a tárolóhely váltására lejátszás előtt + Orosz anyagok törlése + Orosz anyagok visszaállítása + Torrentre kattintás művelete + Torrent fájl megnyitása + Helyi menü megnyitása + Letöltés torrentkliensen keresztül + Letöltés python-libtorrenten keresztül + Keresések rendezése seed alapján + Egyéni keresési lehetőség kifejezésre + Titkosítás + Keresési szálak száma + Törölje a fájlokat + Mentse a fájlokat + Kérdezzen rá + Torrent2HTTP (libtorrent via http) + Proxy automatikus feloldása + Ki + Anti-zapret + Immunicity + Max. kapcsolatok (0 - korlátlan) + Véletlen port használata + Port a bejövő kapcsolatokhoz + Előtöltendő adat lejátszás előtt (MB) + Következő epizód automatikus lejátszása (vagy kérdezzen) + Eszköz konfiguráció + Átlagos/Jó PC + Átlag alatti PC/router + Tárolóhely legkisebb mérete automatikus tisztítás miatt (GB) + Videó szüneteltetése elindítás után + Keresési eredmények rendezése + Seed alapján + Ne rendezze + Név alapján + Ne adja Megtek. Előzm.-hez ennél kevesebb lejátszásnál (%) + Confluence (by safonov_ivan) + Aeon Nox (by joyrider) + pyrrent2http (python-libtorrent via http) + Méret mellékelése a fájl nevéhez + DHT engedélyezése + Kezelőfelület + P2P Hálózat + Haladó + Torrentkliens + Hentai (finomhangolás) + Mentési útvonal + Párbeszédablak + Alapértelmezett + Elérési út + Alkönyvtár készítése a leolvasó számára + Gazdagép + Port + URL + Felhasználónév + Jelszó + Torrentkliens + URL (csak No SSL) + Elérési út helyettesítése (csak távoli) + Bezár + Beállítások megnyitása + Torrentkliens Böngésző + Trackerek telepítése + Tracker beállítások + Tárolóhely tisztítása + Kereső választása + Nem rendelkezel külső keresővel. Kérlek, telepíts egyet. + From 3bba8ce1f68b9284680f8bb03cf749b1d043f4cc Mon Sep 17 00:00:00 2001 From: plasticfighter Date: Wed, 14 Sep 2016 19:37:59 +0200 Subject: [PATCH 008/126] Update Localization.py (Hungarian translation) --- Localization.py | 259 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 259 insertions(+) diff --git a/Localization.py b/Localization.py index ee1b082..5641ffc 100644 --- a/Localization.py +++ b/Localization.py @@ -549,6 +549,265 @@ def localize(text): 'Play (from %s)':'%s נגן מ', 'Play (from start)':'נגן מהתחלה', }, + 'hu': { + 'Seeds searching.': 'Seederek keresése.', + 'Please Wait': 'Kérlek várj', + 'Information': 'Információ', + 'Torrent downloading is stopped.': 'A torrent letöltése befejeződött.', + 'Search': 'Keresés', + 'Seeds': 'Seederek', + 'Peers': 'Kapcsolatok', + 'Materials are loading now.': 'A tartalmak most töltődnek.', + 'Search Phrase': 'Keresés kifejezésre', + 'Magnet-link is converting': 'Magnet-link konvertálása', + 'Error': 'Hiba', + 'Your library out of date and can\'t save magnet-links.': 'A könyvtár elavult, nem lehet lementeni a magnet-linket.', + 'Bookmarks': 'Könyvjelzők', + 'Logout': 'Kijelentkezés', + 'Login': 'Bejelentkezés', + 'Recent Materials': 'Jelenlegi tartalmak', + 'Register': 'Regisztráció', + 'Bookmark': 'Könyvjelző', + 'Item successfully added to Bookmarks': 'Az elem sikeresen hozzáadva a Könyvjelzőkhöz', + 'Item successfully removed from Bookmarks': 'Az elem sikeresen törölve a Könyvjelzőkből', + 'Bookmark not added': 'A könyvjelző nem lett hozzáadva', + 'Bookmark not removed': 'A könyvjelző nem lett törölve', + 'Add To Bookmarks': 'Hozzáadás a Könyvjelzőkhöz', + 'Remove From Bookmarks': 'Eltávolítás a Könyvjelzőkből', + 'Auth': 'Hitelesítés', + 'Already logged in': 'Már be vagy jelentkezve', + 'Input Email (for password recovery):': 'E-mail bevitel (jelszó helyreállításához):', + 'Input Email:': 'E-mail bevitel:', + 'Input Password (6+ symbols):': 'Jelszó bevitel (6+ karakter):', + 'Input Password:': 'Jelszó bevitel:', + 'Login successfull': 'Bejelentkezés sikeres', + 'Login failed': 'Bejelentkezés sikertelen', + 'User not logged in': 'A felhasználó nincs bejelentkezve', + 'User successfully logged out': 'A felhasználó sikeresen kijelentkezett', + 'Preloaded: ': 'Előtöltés: ', + 'Do you want to STOP torrent downloading and seeding?': 'Be akarod fejezni a torrent letöltését és seedelését?', + 'Torrent Downloading': 'Torrent letöltése', + 'Auth expired, please relogin': 'Hitelesítés lejárt, kérlek jelentkezz be újra', + 'Storage': 'Tárolóhely', + 'Storage has been cleared': 'A tárolóhely megtisztítva', + 'Clear Storage': 'Tárolóhely Megtisztítása', + 'Popular': 'Népszerű', + 'Views': 'Nézetek', + 'Uploading': 'Feltöltés', + 'Download': 'Letöltés', + 'Input symbols from CAPTCHA image:': 'Szimbólumok bevitele a CAPTCHA képről:', + 'Please, rate watched video:': 'Kérlek, értékeld a megnézett videót:', + 'Bad': 'Rossz', + 'So-So': 'Elmegy', + 'Good': 'Jó', + 'Ratings': 'Értékelések', + 'Rating': 'Értékelés', + 'Retry': 'Újra', + '%ds has left': '%ds van hátra', + 'File failed to play! Do you want to RETRY and buffer more?': 'A fájl lejátszása hibába ütközött. Újra akarod indítani és többet bufferelni?', + 'High Priority Files': 'Magas prioritású fájlok', + 'Skip All Files': 'Összes fájl kihagyása', + 'Start': 'Indít', + 'Stop': 'Megállít', + 'Play':'Lejátszás', + 'High Priority': 'Magas prioritás', + 'Skip File': 'Fájl kihagyása', + 'Remove': 'Eltávolítás', + 'Remove with files': 'Eltávolítás a fájlokkal együtt', + 'Play File': 'Fájl lejátszása', + 'Start All Files': 'Összes fájl elindítása', + 'Stop All Files': 'Összes fájl megállítása', + 'Torrent-client Browser': 'Torrentkliens Böngésző', + 'Remote Torrent-client': 'Távoli torrentkliens', + 'You didn\'t set up replacement path in setting.': 'Nem állítottál be helyettesítő elérési utat a beállításokban.', + 'For example /media/dl_torr/ to smb://SERVER/dl_torr/. Setup now?': 'Például /media/dl_torr/ a smb://SERVER/dl_torr/ - hez. Beállítod most?', + 'Manual Torrent-client Path Edit': 'Kézi torrentkliens elérési út módosítás', + 'Choose .torrent in video library': '.torrent kiválasztása a videó könyvtárban', + '.torrent Player': '.torrent Lejátszó', + 'Choose directory:': 'Könyvtár kiválasztása:', + 'Starting download next episode!': 'Elindul a következő epizód letöltése!', + 'Choose in torrent-client:': 'Kiválasztás a torrentkliensben:', + 'Search Control Window': 'Keresést Kezelő Ablak', + 'Magnet-link (magnet:...)': 'Magnet-link (magnet:...)', + 'Not a magnet-link!': 'Ez nem magnet-link!', + 'Magnet-link Player': 'Magnet-link Lejátszó', + 'UNKNOWN STATUS': 'ISMERETLEN STÁTUSZ', + 'Checking preloaded files...': 'Előtöltött fájlok ellenőrzése...', + 'Waiting for website response...': 'Várakozás a weboldal válaszára...', + 'Search and cache information for:': 'Információ keresése és gyorsítótárazása:', + 'Open Torrent': 'Torrent megnyitása', + 'Torrent list is empty.': 'A torrent lista üres', + 'Content Lists': 'Tartalmak Listája', + 'Canceled by User': 'Leállítva felhasználó által', + 'Do you want to search and cache full metadata + arts?': 'Szeretnéd lekérni és gyorsítótárazni a metaadatokat és a képeket?', + 'This vastly decreases load speed, but you will be asked to download premade bases!': 'Ez jelentősen csökkenti a betöltési sebességet, megkérünk, hogy töltsd le az előre elkészített adatbázisokat!', + 'Do you want to preload full metadata?': 'Előtöltöd a metaadatokat?', + 'It is highly recommended!': 'Ez erősen ajánlott!', + 'TV Shows': 'Sorozatok', + 'Cartoons': 'Rajzfilmek', + 'Anime': 'Anime', + 'Most Recent': 'Legújabb', + 'Top 250 Movies': 'Top 250 Filmek', + 'Top All Time': 'Top Mindenkori', + 'by Genre': 'Műfaj alapján', + 'by Year': 'Évszám alapján', + 'Action': 'Akció', + 'Adventure': 'Kaland', + 'Animation': 'Animációs', + 'Biography': 'Életrajzi', + 'Comedy': 'Vígjáték', + 'Crime': 'Bűnügyi', + 'Documentary': 'Dokumentum', + 'Drama': 'Dráma', + 'Family': 'Családi', + 'Fantasy': 'Fantasy', + 'Film-Noir': 'Film-Noir', + 'History': 'Történelmi', + 'Horror': 'Horror', + 'Music': 'Zenei', + 'Musical': 'Musical', + 'Mystery': 'Misztikus', + 'Romance': 'Romantikus', + 'Sci-Fi': 'Sci-Fi', + 'Short': 'Rövidfilm', + 'Sport': 'Sport', + 'Thriller': 'Thriller', + 'War': 'Háborús', + 'Western': 'Western', + '[B]by Site[/B]': '[B]Weboldal alapján[/B]', + 'Cartoons Series': 'Rajzfilmsorozatok', + 'Cartoons Short': 'Rövid rajzfilmek', + 'Male': 'Férfi', + 'Female': 'Női', + 'Russia & USSR': 'Oroszország & Szovjetunió', + 'Next Page': 'Következő oldal', + 'Previous Page': 'Előző oldal', + 'Russian Movies': 'Orosz filmek', + 'israeli Movies': 'Izraeli fimek', + 'hebdub movies': 'hebdub filmek', + 'Movies': 'Filmek', + 'High Resolution Movies': 'HD filmek', + '3D Movies': '3D filmek', + 'Movies [Bluray]': 'Filmek [Bluray]', + 'Anime Film': 'Anime filmek', + 'Anime Series': 'Anime sorozatok', + 'Can\'t download torrent, probably no seeds available.': 'Nem lehet letölteni a torrentet, valószínűleg nincsenek elérhető seederek.', + 'Personal List': 'Saját lista', + 'Add to %s': 'Hozzáadás ehhez %s', + 'Delete from %s': 'Eltávolítás innen %s', + 'Added!': 'Hozzáadva!', + 'Deleted!': 'Eltávolítva!', + 'Search History': 'Keresési Előzmények', + ' History ':' Előzmények ', + 'Torrent History':'Torrent Előzmények', + 'Watched History':'Megtekintett Előzmények', + 'Favourites': 'Kedvencek', + 'Favourites SH': 'Kedvencek SH', + 'Clear %s': 'Limpiar %s', + 'Clear!': 'Limpieza exitosa!', + 'kb/s': 'kb/s', + 'Queued': 'Sorba állítva', + 'Checking': 'Ellenőrzés', + 'Downloading metadata': 'Metaadatok letöltése', + 'Downloading': 'Letöltés', + 'Finished': 'Befejezve', + 'Seeding': 'Seedelés', + 'Allocating': 'Összeállítás', + 'Allocating file & Checking resume': 'Fájl összeállítása és folytatás ellenőrzése', + 'For Kids': 'Gyerekek számára', + 'Adult': 'Felnőtt', + 'Does not support magnet links!': 'Nem támogatja a magnet-linkeket!', + 'Reset All Cache DBs': 'Összes gyorsítótár adatbázis visszaállítása', + '[B]Search[/B]': '[B]Keresés[/B]', + 'You can always restart this by deleting DBs via Context Menu': 'Mindig visszaállíthatja az adatbázis törlésével a helyi menün keresztül', + 'Your preloaded databases are outdated!': 'Az előtöltött adatbázisok elavultak!', + 'Do you want to download new ones right now?': 'Szeretnéd letölteni az újakat most?', + 'Individual Tracker Options':'Egyéni tracker beállítások', + 'Downloading and copy subtitles. Please wait.':'Feliratok letöltése és másolása. Kélek, várj.', + 'International Check - First Run':'International ellenőrzés - első futtatás', + 'Delete Russian stuff?':'Orosz tartalom törlése?', + 'Save to path':'Mentés a mappába', + 'Return Russian stuff':'Orosz tartalom visszaállítása', + '%d files have been returned':'%d fájlok visszaállítva', + 'Download via T-client':'Letöltés T-kliensen keresztül', + 'Download via Libtorrent':'Letöltés Libtorrenten keresztül', + 'Download Status':'Letöltési Állapot', + 'Download has not finished yet':'A letöltés még nem fejeződött be', + 'Stopped and Deleted!':'Leállítva és eltávolítva!', + 'Unpaused!':'Újra elindítva!', + 'Paused!':'Szünetelve!', + 'Stopped!':'Megállítva!', + 'Started!':'Elindítva!', + 'Delete and Stop':'Megállít és eltávolít', + 'Unpause':'Újra elindít', + 'Pause':'Szüneteltet', + 'Delete':'Eltávolít', + 'Open (no return)':'Megnyitás (no return)', + 'Torrent is seeding. To stop it use Download Status.':'Torrent seedelés alatt. Ahhoz, hogy megállítsd használd a Letöltési Állapotot.', + 'Start All':'Összes elindítása', + 'Started All!':'Összes elindítva!', + 'Stopped All!':'Összes megállítva!', + 'Stop All':'Összes megállítása', + 'Keyboard':'Billentyűzet', + 'Copy Files in Root':'Fájlok másolása a Rendszerkönyvtárba', + 'Copied %d files!':'%d fájl átmásolva!', + 'Add to MyShows.ru':'Hozzáadás MyShows.ru-hoz', + 'Return to MyShows.ru':'Visszatérés a MyShows.ru-hoz', + 'Search results:':'Keresési eredmények', + 'by Seeders':'Seederek alapján', + 'by Date':'Dátum alapján', + 'Sort':'Rendezés', + 'Close':'Bezár', + 'Views:':'Nézetek:', + 'Rating:':'Értékelés:', + 'Information not found!':'Nem található információ!', + 'Choose searcher':'Válassz keresőt', + 'python-libtorrent Not Found':'python-libtorrent nem található', + 'Windows has static compiled python-libtorrent included.':'A Windows statikusan fordított python-libtorrentet tartalmaz.', + 'You should install "script.module.libtorrent" from "MyShows.me Kodi Repo"':'Telepítsd a "script.module.libtorrent"-et a "MyShows.me Kodi Repo"-ból', + 'Linux x64 has not static compiled python-libtorrent included.':'A Linux x64 statikusan fordított python-libtorrentet nem tartalmaz.', + 'You should install it by "sudo apt-get install python-libtorrent"':'Telepítsd ezzel a paranccsal "sudo apt-get install python-libtorrent"', + 'Linux has static compiled python-libtorrent included but it didn\'t work.':'A Linux statikusan fordított python-libtorrentet tartalmaz de nem működik.', + 'As far as I know you can compile python-libtorrent for ARMv6-7.':'Ahogy én tudom, le lehet fordítani a python-libtorrentet ARMv6-7-ra', + 'You should search for "OneEvil\'s OpenELEC libtorrent" or use Ace Stream.':'Keress rá "OneEvil\'s OpenELEC libtorrent"-re vagy használj Ace Streamet', + 'Please use install Ace Stream APK and choose it in Settings.':'Kérlek használj Ace Stream APK-t és válaszd ki a beállításokban.', + 'It is possible to compile python-libtorrent for Android, but I don\'t know how.':'Lehetséges, hogy lefordítható a python-libtorrent Android-ra, de nem tudom hogyan.', + 'It is possible to compile python-libtorrent for OS X.':'Lehetséges, hogy lefordítható a python-libtorrent OS X-re.', + 'But you would have to do it by yourself, there is some info on github.com.':'De ezt magadnak kell megcsinálnod, van néhány infó erről a github.com-on.', + 'It is NOT possible to compile python-libtorrent for iOS.':'iOS-re nem lehet lefordítani a python-libtorrentet.', + 'But you can use torrent-client control functions.':'De a torrentkliens kezelőt funkciót tudod használni.', + 'I added custom searchers to Torrenter v2!':'Hozzáadtam egyéni keresőket a Torrenter v2-höz!', + 'Now you can use your login on trackers or write and install your own searcher!':'Most már be tudsz lépni a trackerekre, vagy megírhatod és feltelepítheted a saját keresődet!', + 'Would you like to install %s from "MyShows.me Kodi Repo" in Programs section?':'Szeretnéd telepíteni %s a "MyShows.me Kodi Repo"-ból?', + 'Open installation window?':'Telepítő ablak megnyitása?', + 'Android Support':'Android támogatás', + 'Android has no temprorary folder':'Az Android nem rendelkezik ideiglenes mappával', + 'Please specify storage folder in Settings!':'Kérlek add meg a tárolóhely mappáját a beállításokban!', + 'You have no installed or active searchers! More info in Search Control Window!':'Nincsenek telepített vagy aktív keresők! Több információ a Keresést Kezelő Abalakban.', + 'Please contact DiMartino on kodi.tv forum. We compiled python-libtorrent for Android,':'Kérünk lépj kapcsolatba DiMartino-val a kodi.tv fórumon. Lefordítottuk a python-libtorrentet Androidhoz,', + 'but we need your help with some tests on different processors.':'de szükségünk lesz még néhány tesztre különböző processzorokon.', + 'We added Android ARM full support to Torrenter v2!':'A Torrenter v2 számara teljesen támogatottá tettük az Android ARM-t!', + 'I deleted pre-installed ones, install them in Search Control Window!':'Töröltem az összes előre telepítettet, telepítsd őket a Keresést Kezelő Ablakban!', + 'Torrenter didn\'t find %s searcher':'A Torrenter nem találja a %s keresőt', + 'Torrenter Tracker Install':'Torrent tracker telepítés', + 'Ask to save':'Mentés kérése', + 'Would you like to save this file?':'El szeretnéd menteni ez a fájlt?', + 'Your storage path is not writable or not local! Please change it in settings!':'A tárolóhely elérési útja nem írható vagy nem elérhető! Kérlek változtatsd meg a beállításokban!', + 'Upgrade advancedsettings.xml':'advancedsettings.xml frissítése', + 'We would like to set some advanced settings for you!':'Be szeretnénk állítani néhány haladó beállítást!', + 'Do it!':'Csináld!', + 'Please, restart Kodi now!':'Kérkek, indítsd újra a Kodit, most.', + './ (Root folder)':'./ (Rendszerkönyvtár)', + 'Opening torrent file':'Torrent fájl megnyitása', + 'New player to Torrenter v2 - Torrent2HTTP! It should be faster, stable and better with Android, also seeking works in it.':'Új lejátszó a Torrenter v2-höz - Torrent2HTTP: Gyorsabb, stabilabb és jobb Androiddal, valamint a keresés is működik vele.', + 'Would you like to try it?':'Ki szeretnéd próbálni?', + 'Torrent2HTTP enabled! Can be changed in Settings.':'Torrent2HTTP engedélyezve! Ezen a beállításokban tudsz változtatni.', + 'Seeking':'Keresés', + 'Would you like to resume from %s?':'Szeretnéd folytatni innen: %s?', + 'Seeking is working only with player Torrent2HTTP.':'A keresés csak a Torrent2HTTP lejátszóval működik.', + 'Play (from %s)':'Lejátszás (innen %s)', + 'Play (from start)':'Lejátszás (az elejétől)', + }, 'ru': { 'Seeds searching.': 'Идёт поиск сидов.', 'Please Wait': 'Подождите', From e62324535b22e93ba8442f208bb3e0898c792433 Mon Sep 17 00:00:00 2001 From: plasticfighter Date: Wed, 14 Sep 2016 19:56:55 +0200 Subject: [PATCH 009/126] Update strings.xml --- resources/language/Hungarian/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/language/Hungarian/strings.xml b/resources/language/Hungarian/strings.xml index 31f3f9e..0eb3145 100644 --- a/resources/language/Hungarian/strings.xml +++ b/resources/language/Hungarian/strings.xml @@ -29,8 +29,8 @@ Feliratok előtöltése az összes mappából Seedben tartás megtekintés után Kérdezzen rá a tárolóhely váltására lejátszás előtt - Orosz anyagok törlése - Orosz anyagok visszaállítása + Orosz tartalmak törlése + Orosz tartalmak visszaállítása Torrentre kattintás művelete Torrent fájl megnyitása Helyi menü megnyitása From b205ccf1827d5b62c8245b8bb1408ac04cf8ac82 Mon Sep 17 00:00:00 2001 From: plasticfighter Date: Wed, 14 Sep 2016 20:00:30 +0200 Subject: [PATCH 010/126] Update Localization.py --- Localization.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Localization.py b/Localization.py index 5641ffc..4728b61 100644 --- a/Localization.py +++ b/Localization.py @@ -636,7 +636,7 @@ def localize(text): 'Waiting for website response...': 'Várakozás a weboldal válaszára...', 'Search and cache information for:': 'Információ keresése és gyorsítótárazása:', 'Open Torrent': 'Torrent megnyitása', - 'Torrent list is empty.': 'A torrent lista üres', + 'Torrent list is empty.': 'A torrent lista üres.', 'Content Lists': 'Tartalmak Listája', 'Canceled by User': 'Leállítva felhasználó által', 'Do you want to search and cache full metadata + arts?': 'Szeretnéd lekérni és gyorsítótárazni a metaadatokat és a képeket?', @@ -703,8 +703,8 @@ def localize(text): 'Watched History':'Megtekintett Előzmények', 'Favourites': 'Kedvencek', 'Favourites SH': 'Kedvencek SH', - 'Clear %s': 'Limpiar %s', - 'Clear!': 'Limpieza exitosa!', + 'Clear %s': 'Tisztítás %s', + 'Clear!': 'Tisztítás!', 'kb/s': 'kb/s', 'Queued': 'Sorba állítva', 'Checking': 'Ellenőrzés', @@ -723,7 +723,7 @@ def localize(text): 'Your preloaded databases are outdated!': 'Az előtöltött adatbázisok elavultak!', 'Do you want to download new ones right now?': 'Szeretnéd letölteni az újakat most?', 'Individual Tracker Options':'Egyéni tracker beállítások', - 'Downloading and copy subtitles. Please wait.':'Feliratok letöltése és másolása. Kélek, várj.', + 'Downloading and copy subtitles. Please wait.':'Feliratok letöltése és másolása. Kérlek, várj.', 'International Check - First Run':'International ellenőrzés - első futtatás', 'Delete Russian stuff?':'Orosz tartalom törlése?', 'Save to path':'Mentés a mappába', @@ -753,7 +753,7 @@ def localize(text): 'Copied %d files!':'%d fájl átmásolva!', 'Add to MyShows.ru':'Hozzáadás MyShows.ru-hoz', 'Return to MyShows.ru':'Visszatérés a MyShows.ru-hoz', - 'Search results:':'Keresési eredmények', + 'Search results:':'Keresési eredmények:', 'by Seeders':'Seederek alapján', 'by Date':'Dátum alapján', 'Sort':'Rendezés', @@ -796,7 +796,7 @@ def localize(text): 'Upgrade advancedsettings.xml':'advancedsettings.xml frissítése', 'We would like to set some advanced settings for you!':'Be szeretnénk állítani néhány haladó beállítást!', 'Do it!':'Csináld!', - 'Please, restart Kodi now!':'Kérkek, indítsd újra a Kodit, most.', + 'Please, restart Kodi now!':'Kérlek, indítsd újra a Kodit, most.', './ (Root folder)':'./ (Rendszerkönyvtár)', 'Opening torrent file':'Torrent fájl megnyitása', 'New player to Torrenter v2 - Torrent2HTTP! It should be faster, stable and better with Android, also seeking works in it.':'Új lejátszó a Torrenter v2-höz - Torrent2HTTP: Gyorsabb, stabilabb és jobb Androiddal, valamint a keresés is működik vele.', From c7bcd9c4503515adf0a57a12a952588cf8f4e410 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Fri, 4 Nov 2016 16:34:40 +0300 Subject: [PATCH 011/126] hz --- .idea/workspace.xml | 2111 +++++++++++++--------- Core.py | 4 +- resources/contenters/IMDB.py | 11 +- resources/contenters/{ => unused}/CXZ.py | 0 resources/contenters/unused/__init__.py | 0 resources/proxy/antizapret.py | 11 +- 6 files changed, 1234 insertions(+), 903 deletions(-) rename resources/contenters/{ => unused}/CXZ.py (100%) create mode 100644 resources/contenters/unused/__init__.py diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 8e0ab87..20826cc 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,12 +1,14 @@ - + + + + - - + - + @@ -24,7 +26,7 @@ - + @@ -36,11 +38,11 @@ - + - - + + @@ -96,8 +98,8 @@ - - + + @@ -105,24 +107,23 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -131,57 +132,129 @@ - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -201,45 +274,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + @@ -298,6 +337,7 @@ + @@ -315,6 +355,9 @@ + + + @@ -322,6 +365,7 @@ + @@ -428,248 +472,232 @@ - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - + + @@ -678,8 +706,8 @@ - - + + @@ -706,33 +734,138 @@ - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + + + + + + + + + + + @@ -760,12 +893,6 @@ @@ -895,6 +1028,68 @@ @@ -929,6 +1124,7 @@ + @@ -1113,48 +1309,6 @@ @@ -1470,13 +1666,13 @@ - + + - @@ -1489,7 +1685,7 @@ - + @@ -1506,11 +1702,6 @@ - - - - - @@ -1531,7 +1722,12 @@ - @@ -1540,41 +1736,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1666,13 +1827,6 @@ - - - - - - - @@ -1687,28 +1841,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -1723,13 +1855,6 @@ - - - - - - - @@ -1737,27 +1862,9 @@ - - - - - - - - - - - - - - - - - - - - - + + + @@ -1773,39 +1880,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1814,66 +1888,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - + + - - + + @@ -1899,36 +2015,340 @@ - + - - + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + @@ -1987,6 +2407,7 @@ + @@ -2004,6 +2425,9 @@ + + + @@ -2011,6 +2435,7 @@ + @@ -2117,310 +2542,212 @@ - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core.py b/Core.py index d667c03..fbef4ff 100644 --- a/Core.py +++ b/Core.py @@ -991,7 +991,7 @@ class Core: title = title.encode('utf-8', 'ignore') except: continue - label = info.get('label').encode('utf-8', 'ignore') + log(str(info)) if info.get('link'): if isinstance(info.get('link'), tuple): @@ -1112,7 +1112,7 @@ class Core: images = {'icon':image, 'thumb':image} images = {'icon': image, 'thumb': image, 'poster': image, 'banner': image, - 'fanart': image, 'landscape': image, + #'fanart': image, 'landscape': image, #'clearart': image, 'clearlogo': image, } listitem.setArt(images) diff --git a/resources/contenters/IMDB.py b/resources/contenters/IMDB.py index 334648e..bb61442 100644 --- a/resources/contenters/IMDB.py +++ b/resources/contenters/IMDB.py @@ -99,27 +99,28 @@ class IMDB(Content.Content): return True def get_contentList(self, category, subcategory=None, apps_property=None): + self.debug = self.log contentList = [] url = self.get_url(category, subcategory, apps_property) response = self.makeRequest(url, headers=self.headers) if None != response and 0 < len(response): - #print response + self.debug(response) if category in ['top']: contentList = self.topmode(response) elif category == 'search': contentList = self.searchmode(response) else: #if category in ['genre']: contentList = self.genremode(response) - #print str(contentList) + self.debug(str(contentList)) return contentList def searchmode(self, response): contentList = [] pars = HTMLParser.HTMLParser() Soup = BeautifulSoup(response) - result = Soup.findAll('tr', {'class': ['findResult odd', 'findResult even']}) + result = Soup.findAll('tr', {'class': 'lister-item mode-advanced'}) num = 250 for tr in result: #main @@ -147,7 +148,7 @@ class IMDB(Content.Content): int(int(self.sourceWeight) * (251 - int(num))), originaltitle, title, int(year), img, info, )) - #print result + self.debug(str(result)) return contentList def genremode(self, response): @@ -181,7 +182,7 @@ class IMDB(Content.Content): int(int(self.sourceWeight) * (251 - int(num))), originaltitle, title, int(year), img, info, )) - #print result + self.debug(str(result)) return contentList def biggerImg(self, img): diff --git a/resources/contenters/CXZ.py b/resources/contenters/unused/CXZ.py similarity index 100% rename from resources/contenters/CXZ.py rename to resources/contenters/unused/CXZ.py diff --git a/resources/contenters/unused/__init__.py b/resources/contenters/unused/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/resources/proxy/antizapret.py b/resources/proxy/antizapret.py index 0decbe2..7da16ea 100644 --- a/resources/proxy/antizapret.py +++ b/resources/proxy/antizapret.py @@ -21,20 +21,23 @@ def shelf(filename, ttl=0): with LOCKS.get(filename, threading.RLock()): # with closing(shelve.open(filename, writeback=True)) as d: d = shelve.open(filename, writeback=True) - try: + #try: + if True: import time if not dict(d): + log('xxx') d.update({ "created_at": time.time(), "data": {}, }) elif ttl > 0 and (time.time() - d["created_at"]) > ttl: + log('xxx') d["created_at"] = time.time() d["data"] = {} return d - except: - d.close() - raise + #except: + # d.close() + # raise _config = {} From 47093910a6ae0184450be5a13c3612f5e6a9ef8d Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Fri, 4 Nov 2016 16:41:33 +0300 Subject: [PATCH 012/126] hu --- .idea/workspace.xml | 2303 +++++++++++++++--------------- Core.py | 2 +- addon.xml | 2 +- changelog.txt | 10 +- functions.py | 2 + resources/contenters/__init__.py | 0 resources/settings.xml | 2 +- 7 files changed, 1174 insertions(+), 1147 deletions(-) create mode 100644 resources/contenters/__init__.py diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 20826cc..e4f06a2 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,14 +1,14 @@ - - - - + + - - + + + + @@ -41,8 +41,8 @@ - - + + @@ -65,21 +65,21 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + @@ -263,8 +263,8 @@ - - + + @@ -277,407 +277,407 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -744,21 +744,11 @@ - - - - - - - - - - - - + + @@ -768,84 +758,84 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -914,8 +904,6 @@ @@ -1028,86 +1018,6 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1702,7 +1723,6 @@ - @@ -1727,7 +1747,8 @@ - @@ -1872,22 +1893,6 @@ - - - - - - - - - - - - - - - - @@ -2022,111 +2027,87 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2300,10 +2281,50 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2326,428 +2347,428 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core.py b/Core.py index fbef4ff..0de889a 100644 --- a/Core.py +++ b/Core.py @@ -36,7 +36,7 @@ class Core: torrent_player = __settings__.getSetting("torrent_player") history_bool = __settings__.getSetting('history') == 'true' open_option = int(__settings__.getSetting('open_option')) - language = {0: 'en', 1: 'ru', 2: 'uk', 3: 'he'}.get(int(__settings__.getSetting("language"))) + language = {0: 'en', 1: 'ru', 2: 'uk', 3: 'he', 4: 'hu'}.get(int(__settings__.getSetting("language"))) scrapperDB_ver = {'en':'1.1', 'ru':'1.3', 'he':'1.3'} log('SYS ARGV: ' + str(sys.argv)) diff --git a/addon.xml b/addon.xml index 3510c38..9ba86b7 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 09674ff..dfd04ec 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,13 +1,17 @@ English changelog at http://bit.ly/1MfSVUP +[B]Version 2.5.3[/B] +[+] Венгерский язык + + [B]Version 2.5.2[/B] -[+] Упорядочивание по разверу файла. +[+] Упорядочивание по разверу файла [B]Version 2.5.1[/B] -[+] Исправлена работа с кодировками. +[+] Исправлена работа с кодировками [B]Version 2.5.0[/B] -[+] НОВЫЙ проигрыватель pyrrent2http от inpos! Аналог torrent2http написаный на python, а не на GO. +[+] НОВЫЙ проигрыватель pyrrent2http от inpos! Аналог torrent2http написаный на python, а не на GO [+] Проигрыватель: Ускорена повторная работа с торрентом - resume data (спасибо srg70 и RussakHH) [B]Version 2.4.6[/B] diff --git a/functions.py b/functions.py index d514917..ce82361 100644 --- a/functions.py +++ b/functions.py @@ -1306,6 +1306,8 @@ class Contenters(): def first_time(self, scrapperDB_ver, language='ru'): from resources.scrapers.scrapers import Scrapers + if language not in ['en','ru','he']: + language = 'ru' searcher = 'metadata' redl = False scrapperDB_ver = scrapperDB_ver[language] diff --git a/resources/contenters/__init__.py b/resources/contenters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/resources/settings.xml b/resources/settings.xml index 7bde912..18daeed 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -1,6 +1,6 @@  - + From 7effa3086023e0e50610d1bcb2f2c528c2e76735 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Fri, 4 Nov 2016 17:31:31 +0300 Subject: [PATCH 013/126] Kodi 17 --- .idea/workspace.xml | 1290 ++++-------------------- changelog.txt | 2 +- functions.py | 26 +- resources/contenters/KickAssSo.py | 2 +- resources/language/English/strings.xml | 1 + resources/language/Russian/strings.xml | 1 + resources/settings.xml | 2 +- 7 files changed, 215 insertions(+), 1109 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index e4f06a2..4297a2a 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,12 +2,12 @@ - - - + + + @@ -38,49 +38,32 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + @@ -264,7 +247,7 @@ - + @@ -277,468 +260,30 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -747,115 +292,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -918,22 +356,22 @@ @@ -1018,6 +456,86 @@ @@ -1692,6 +1210,7 @@ + @@ -1706,7 +1225,6 @@ - @@ -1723,7 +1241,6 @@ - @@ -1748,7 +1265,8 @@ - @@ -1757,13 +1275,6 @@ - - - - - - - @@ -1967,22 +1478,6 @@ - - - - - - - - - - - - - - - - @@ -1997,7 +1492,7 @@ - + @@ -2235,13 +1730,6 @@ - - - - - - - @@ -2289,14 +1777,6 @@ - - - - - - - - @@ -2305,10 +1785,18 @@ + + + + + + + + - - + + @@ -2316,462 +1804,60 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/changelog.txt b/changelog.txt index dfd04ec..cf792f3 100644 --- a/changelog.txt +++ b/changelog.txt @@ -2,7 +2,7 @@ [B]Version 2.5.3[/B] [+] Венгерский язык - +[+] Совместимость с Коди 17 [B]Version 2.5.2[/B] [+] Упорядочивание по разверу файла diff --git a/functions.py b/functions.py index ce82361..4ca9123 100644 --- a/functions.py +++ b/functions.py @@ -575,14 +575,14 @@ def view_style(func): styles['sectionMenu'] = styles['Seasons'] = 'list' styles['uTorrentBrowser'] = styles['torrentPlayer'] = styles['openTorrent'] = 'wide' styles['showFilesList'] = styles['DownloadStatus'] = 'wide' - elif view_style in [1, 4, 5]: + elif view_style in [1, 4, 5, 7]: styles['searchOption'] = 'info' styles['drawContent'] = styles['torrentPlayer'] = styles['openTorrent'] = styles['drawtrackerList'] = 'info' styles['uTorrentBrowser'] = styles['History'] = styles['DownloadStatus'] = 'wide' styles['showFilesList'] = styles['sectionMenu'] = 'wide' styles['List'] = styles['drawcontentList'] = 'info3' - if view_style == 1: + if view_style in [1, 7]: styles['uTorrentBrowser'] = styles['torrentPlayer'] = 'wide' styles['openTorrent'] = styles['History'] = styles['DownloadStatus'] = 'wide' styles['sectionMenu'] = 'icons' @@ -598,9 +598,11 @@ def view_style(func): num_skin = 1 elif view_style == 6: num_skin = 2 + elif view_style == 7: + num_skin = 3 style = styles.get(func) - # debug('[view_style]: lock '+str(style)) + log('[view_style]: lock '+str(style)+' for '+str(func)) lockView(style, num_skin) @@ -610,12 +612,28 @@ def lockView(viewId='info', num_skin=0): {'list': 50, 'info': 50, 'wide': 51, 'icons': 500, 'info3': 515, }, # Confluence {'list': 50, 'info': 51, 'wide': 52, 'icons': 53, }, # Transperency! {'list': 55, 'info': 55, 'wide': 55, 'icons': 55, 'info3': 55, }, # Aeon Nox + {'list': 50, 'info': 54, 'wide': 55, 'icons': 54, 'info3': 500, }, # Estuary ) try: + if viewId == 'wide' and num_skin == 3: + xbmcplugin.setContent(int(sys.argv[1]), 'files') xbmc.executebuiltin("Container.SetViewMode(%s)" % str(skinOptimizations[num_skin][viewId])) except: return + ''' Estuary + View_50_List + View_51_Poster + View_52_IconWall + View_53_Shift + View_54_InfoWall + View_55_WideList + View_500_SmallThumb + View_501_Banner + View_502_FanArt + ''' + + ''' PosterWrapView2_Fanart MediaListView3 @@ -1360,7 +1378,7 @@ class Contenters(): searchersList = [] dirList = os.listdir(ROOT + os.sep + 'resources' + os.sep + 'contenters') for searcherFile in dirList: - if re.match('^(\w+)\.py$', searcherFile): + if re.match('^(\w+)\.py$', searcherFile) and searcherFile != '__init__.py': searchersList.append(searcherFile.replace('.py', '')) return searchersList diff --git a/resources/contenters/KickAssSo.py b/resources/contenters/KickAssSo.py index 35dd2c9..36df64d 100644 --- a/resources/contenters/KickAssSo.py +++ b/resources/contenters/KickAssSo.py @@ -100,7 +100,7 @@ class KickAssSo(Content.Content): num = 51 good_forums = ['TV', 'Anime', 'Movies'] regex = '''''' - regex_tr = r'''title="Download torrent file" href="(.+?)" class=".+?">(.+?).+? in .+?">(.+?).+?(.+?).+?(\d+ .+?).+?(\d+?).+?(\d+?)''' + regex_tr = r'''(.+?).+? in .+?">(.+?).+?(.+?).+?(\d+ .+?).+?(\d+?).+?(\d+?)''' for tr in re.compile(regex, re.DOTALL).findall(response): result=re.compile(regex_tr, re.DOTALL).findall(tr) if result: diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 8897896..d58ab3b 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -68,6 +68,7 @@ pyrrent2http (python-libtorrent via http) Append size to file name Enable DHT + Estuary (by DiMartino) Interface P2P Network Advanced diff --git a/resources/language/Russian/strings.xml b/resources/language/Russian/strings.xml index fb67ec9..015559c 100644 --- a/resources/language/Russian/strings.xml +++ b/resources/language/Russian/strings.xml @@ -68,6 +68,7 @@ pyrrent2http (python-libtorrent по http) Добавлять размер к имени файла Включить DHT + Estuary (от DiMartino) Интерфейс P2P Сеть Дополнительные diff --git a/resources/settings.xml b/resources/settings.xml index 18daeed..ff71017 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -4,7 +4,7 @@ - + From 3744b3ccd7b70dd9fa753d1c4e5a75251157915a Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Thu, 17 Nov 2016 18:16:47 +0300 Subject: [PATCH 014/126] char fix --- functions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/functions.py b/functions.py index 4ca9123..0f33e64 100644 --- a/functions.py +++ b/functions.py @@ -2083,7 +2083,8 @@ def localize_path(path): def encode_msg(msg): try: - msg = isinstance(msg, unicode) and msg.encode('utf-8') or msg + msg = isinstance(msg, unicode) and msg.encode( + (sys.getfilesystemencoding() not in ('ascii', 'ANSI_X3.4-1968')) and sys.getfilesystemencoding() or 'utf-8') or msg except: import traceback log(traceback.format_exc()) From 7c141b6496c7b104d65f564aa8dd99b72da050ed Mon Sep 17 00:00:00 2001 From: Kingul Date: Mon, 21 Nov 2016 14:11:50 +0200 Subject: [PATCH 015/126] fix open (no return) XBMC.Container.Update will let users to go back in search window after loading torrent, much better behaviour --- Core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core.py b/Core.py index 0de889a..ab3535a 100644 --- a/Core.py +++ b/Core.py @@ -1616,7 +1616,7 @@ class Core: 'XBMC.RunPlugin(%s)' % ('%s?action=%s&url=%s') % ( sys.argv[0], 'downloadLibtorrent', urllib.quote_plus(link))), (self.localize('Open (no return)'), - 'XBMC.ActivateWindow(Videos,%s)' % ('%s?action=%s%s') % ( + 'XBMC.Container.Update(%s)' % ('%s?action=%s%s') % ( sys.argv[0], 'openTorrent', link_url)), ] title = self.titleMake(seeds, leechers, size, title) From e21c537d4e83886e1dc8a19741d34c2215d93a3d Mon Sep 17 00:00:00 2001 From: Kingul Date: Mon, 21 Nov 2016 16:50:17 +0200 Subject: [PATCH 016/126] removed skorba debug fix open in localization --- Core.py | 13 +++++-------- Localization.py | 10 +++++----- SkorbaLoader.py | 2 +- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/Core.py b/Core.py index ab3535a..c38e425 100644 --- a/Core.py +++ b/Core.py @@ -1615,7 +1615,7 @@ class Core: (self.localize('Download via Libtorrent'), 'XBMC.RunPlugin(%s)' % ('%s?action=%s&url=%s') % ( sys.argv[0], 'downloadLibtorrent', urllib.quote_plus(link))), - (self.localize('Open (no return)'), + (self.localize('Open'), 'XBMC.Container.Update(%s)' % ('%s?action=%s%s') % ( sys.argv[0], 'openTorrent', link_url)), ] @@ -1815,13 +1815,10 @@ class Core: clAliceblue = '[COLOR FFF0F8FF]%s[/COLOR]' clRed = '[COLOR FFFF0000]%s[/COLOR]' - title = title.replace('720p', '[B]720p[/B]') - title = clWhite % title + chr(10) - second = '[I](%s) [S/L: %d/%d] [/I]' % (size, seeds, leechers) + chr(10) - space = '' - for i in range(0, 180 - len(second)): - space += ' ' - title += space + second + title = title.replace('720p', '[B]720p[/B]').replace('1080p', '[B]1080p[/B]') + title = clWhite % title + second = '[I](%s) [S/L: %d/%d] [/I]' % (size, seeds, leechers) + title += ' ' + second return title def search(self, params={}): diff --git a/Localization.py b/Localization.py index 4728b61..55e5422 100644 --- a/Localization.py +++ b/Localization.py @@ -224,7 +224,7 @@ def localize(text): 'Unpause':'Des-pausar', 'Pause':'Pausar', 'Delete':'Eliminar', - 'Open (no return)':'Abrir (sin retorno)', + 'Open':'Abrir', 'Torrent is seeding. To stop it use Download Status.':'El toorrent esta siendo compartido. Para detenerlo, utiliza el dialogo de descarga.', 'Start All':'Iniciar Todo', 'Started All!':'Todo ha sido iniciado', @@ -483,7 +483,7 @@ def localize(text): 'Unpause':'אל תפסיק', 'Pause':'הפסק', 'Delete':'מחק', - 'Open (no return)':'פתח', + 'Open':'פתח', 'Torrent is seeding. To stop it use Download Status.':'Torrent is seeding. To stop it use Download Status.', 'Start All':'התחל הכל', 'Started All!':'מיין הכל', @@ -742,7 +742,7 @@ def localize(text): 'Unpause':'Újra elindít', 'Pause':'Szüneteltet', 'Delete':'Eltávolít', - 'Open (no return)':'Megnyitás (no return)', + 'Open':'Megnyitás', 'Torrent is seeding. To stop it use Download Status.':'Torrent seedelés alatt. Ahhoz, hogy megállítsd használd a Letöltési Állapotot.', 'Start All':'Összes elindítása', 'Started All!':'Összes elindítva!', @@ -1001,7 +1001,7 @@ def localize(text): 'Unpause':'Возобновить', 'Pause':'Пауза', 'Delete':'Удалить', - 'Open (no return)':'Открыть (без возврата)', + 'Open':'Открыть', 'Torrent is seeding. To stop it use Download Status.':'Сидирование. Для остановки используйте Статус Загрузки.', 'Start All':'Запустить Все', 'Started All!':'Все Запущены!', @@ -1259,7 +1259,7 @@ def localize(text): 'Unpause':'Відновити', 'Pause':'Пауза', 'Delete':'Видалити', - 'Open (no return)':'Відкрити (без повернення)', + 'Open':'Відкрити', 'Torrent is seeding. To stop it use Download Status.':'Сідування. Для зупинки використовуйте Статус завантаження.', 'Start All':'Запустити все', 'Started All!':'Все запущене!', diff --git a/SkorbaLoader.py b/SkorbaLoader.py index 30b02c4..5fd2afe 100644 --- a/SkorbaLoader.py +++ b/SkorbaLoader.py @@ -332,7 +332,7 @@ class SkorbaLoader: iterator = int(s.progress * 100) info['progress'] = iterator db.update(title, info) - self.debug() + #self.debug() self.session.remove_torrent(self.torrentHandle) return From 4ee1b5bf9b7e3ffe0838a68c34ed9055ea5fca02 Mon Sep 17 00:00:00 2001 From: Kingul Date: Mon, 21 Nov 2016 17:10:55 +0200 Subject: [PATCH 017/126] missed one no return --- Core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core.py b/Core.py index c38e425..626e352 100644 --- a/Core.py +++ b/Core.py @@ -1676,8 +1676,8 @@ class Core: (self.localize('Add to %s') % return_name, 'XBMC.RunPlugin(%s)' % (back_url+'&stringdata=' + urllib.quote_plus( json.dumps(sdata)))), - (self.localize('Open (no return)'), - 'XBMC.ActivateWindow(Videos,%s)' % ('%s?action=%s%s') % ( + (self.localize('Open'), + 'XBMC.Container.Update(%s)' % ('%s?action=%s%s') % ( sys.argv[0], 'openTorrent', link_url)), (self.localize('Return to %s') % return_name, 'XBMC.ActivateWindow(%s)' % ('Videos,%s' % return_url)), From c7f9f54fb0fa592c89c086d87399ee7affea6d22 Mon Sep 17 00:00:00 2001 From: Kingul Date: Mon, 21 Nov 2016 19:23:37 +0200 Subject: [PATCH 018/126] hack for context menu not showing every time --- Core.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Core.py b/Core.py index 626e352..a984193 100644 --- a/Core.py +++ b/Core.py @@ -1148,14 +1148,14 @@ class Core: contextMenu = [(self.localize('Search Control Window'), 'xbmc.RunScript(%s,)' % os.path.join(ROOT, 'controlcenter.py'))] replaceMenu = False - if contextMenu: - listitem.addContextMenuItems(contextMenu, replaceItems=replaceMenu) if isFolder: listitem.setProperty("Folder", "true") listitem.setInfo(type='Video', infoLabels=info) else: listitem.setInfo(type='Video', infoLabels=info) listitem.setArt({'thumb': image}) + if contextMenu: + listitem.addContextMenuItems(contextMenu, replaceItems=replaceMenu) xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=url, listitem=listitem, isFolder=isFolder) def getParameters(self, parameterString): @@ -1694,7 +1694,7 @@ class Core: def context(self, params={}): xbmc.executebuiltin("Action(ContextMenu)") - return + sys.exit() def downloadFilesList(self, params={}): from resources.utorrent.net import Download From f767f6353ebe8b54fbff0adbf6948c12bab73fb0 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Mon, 21 Nov 2016 22:19:46 +0300 Subject: [PATCH 019/126] version up --- .idea/workspace.xml | 306 ++++++-------------------------------------- addon.xml | 2 +- changelog.txt | 3 + 3 files changed, 42 insertions(+), 269 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 4297a2a..dd00281 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -3,12 +3,8 @@ + - - - - - @@ -41,14 +37,14 @@ - + - + @@ -61,7 +57,7 @@ - + @@ -243,11 +239,11 @@ - + - - + + @@ -262,9 +258,7 @@ - - - + @@ -272,7 +266,7 @@ - + @@ -282,7 +276,7 @@ - + @@ -364,14 +358,14 @@ @@ -538,8 +532,8 @@ - + @@ -560,117 +554,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + @@ -1225,6 +1107,7 @@ + @@ -1411,13 +1294,7 @@ - - - - - - - + @@ -1482,7 +1359,6 @@ - @@ -1490,28 +1366,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -1526,84 +1380,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1749,7 +1525,6 @@ - @@ -1765,15 +1540,6 @@ - - - - - - - - - @@ -1781,7 +1547,6 @@ - @@ -1789,7 +1554,6 @@ - @@ -1801,17 +1565,9 @@ - - - - - - - - - + @@ -1819,7 +1575,7 @@ - + @@ -1827,7 +1583,7 @@ - + @@ -1837,15 +1593,13 @@ - - - + - + @@ -1859,5 +1613,21 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/addon.xml b/addon.xml index 9ba86b7..64af85d 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index cf792f3..e39aab4 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,8 @@ English changelog at http://bit.ly/1MfSVUP +[B]Version 2.5.4[/B] +Исправлено "открыть без возврата". Спасибо viorel-m. + [B]Version 2.5.3[/B] [+] Венгерский язык [+] Совместимость с Коди 17 From b31b5825c2c3f2266069cb8ae6fe098453999aba Mon Sep 17 00:00:00 2001 From: Kingul Date: Wed, 23 Nov 2016 13:50:34 +0200 Subject: [PATCH 020/126] Kodi 17 open context menu when is default for onclick torrent --- Core.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Core.py b/Core.py index a984193..c996b67 100644 --- a/Core.py +++ b/Core.py @@ -1693,8 +1693,28 @@ class Core: xbmcplugin.endOfDirectory(handle=int(sys.argv[1]), succeeded=True) def context(self, params={}): - xbmc.executebuiltin("Action(ContextMenu)") - sys.exit() + if int(self.version_check()[:2]) < 17: + xbmc.executebuiltin("Action(ContextMenu)") + sys.exit() + else: + fixed = xbmcgui.Dialog().contextmenu(list=[(self.localize('Open')), + (self.localize('Download via Libtorrent')), + (self.localize('Download via T-client'))]) + if fixed == 0: + xbmc.executebuiltin('XBMC.Container.Update(%s)' % + ('%s?action=%s&url=%s') % + (sys.argv[0], 'openTorrent', params['url'])) + elif fixed == 1: + xbmc.executebuiltin('XBMC.RunPlugin(%s)' % + ('%s?action=%s&url=%s') % + (sys.argv[0], 'downloadLibtorrent', params['url'])) + elif fixed == 2: + xbmc.executebuiltin('XBMC.RunPlugin(%s)' % + ('%s?action=%s&url=%s') % + (sys.argv[0], 'downloadFilesList', params['url'])) + + def version_check(self): + return xbmc.getInfoLabel( "System.BuildVersion" ) def downloadFilesList(self, params={}): from resources.utorrent.net import Download From 95bc776895e8e48962171a632d78c27a2774d480 Mon Sep 17 00:00:00 2001 From: Kingul Date: Wed, 23 Nov 2016 20:13:05 +0200 Subject: [PATCH 021/126] fix kickass contenter movie thumb --- resources/contenters/KickAssSo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/contenters/KickAssSo.py b/resources/contenters/KickAssSo.py index 36df64d..3867011 100644 --- a/resources/contenters/KickAssSo.py +++ b/resources/contenters/KickAssSo.py @@ -143,7 +143,7 @@ class KickAssSo(Content.Content): 'kinopoisk': ''} try: img = result.find('a', {'class': 'movieCover'}).find('img').get('src') - movieInfo['poster'] = 'http:' + img + movieInfo['poster'] = img if img.startswith('http:') else 'http:' + img except: pass try: From 791481214ec1f9fb4ff3ea60753d50655a1dfe16 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sat, 26 Nov 2016 11:17:36 +0300 Subject: [PATCH 022/126] check version --- Core.py | 5 +++-- addon.xml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Core.py b/Core.py index c996b67..487c7bc 100644 --- a/Core.py +++ b/Core.py @@ -1410,6 +1410,7 @@ class Core: def playTorrent(self, params={}): torrentUrl = self.__settings__.getSetting("lastTorrent") + #xbmc.executebuiltin('Action(Stop)') self.userStorage(params) if self.torrent_player == '0': from Player import TorrentPlayer @@ -1693,7 +1694,7 @@ class Core: xbmcplugin.endOfDirectory(handle=int(sys.argv[1]), succeeded=True) def context(self, params={}): - if int(self.version_check()[:2]) < 17: + if not self.version_check(): xbmc.executebuiltin("Action(ContextMenu)") sys.exit() else: @@ -1714,7 +1715,7 @@ class Core: (sys.argv[0], 'downloadFilesList', params['url'])) def version_check(self): - return xbmc.getInfoLabel( "System.BuildVersion" ) + return False if int(xbmc.getInfoLabel( "System.BuildVersion" )[:2]) < 17 else True def downloadFilesList(self, params={}): from resources.utorrent.net import Download diff --git a/addon.xml b/addon.xml index 64af85d..eb5e848 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + From 4ff0f33bd28e7928ac7a5c143c8ee2473a54d38a Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sat, 26 Nov 2016 11:56:53 +0300 Subject: [PATCH 023/126] control center update --- addon.xml | 1 + controlcenter.py | 35 +- functions.py | 7 +- resources/contenters/KickAssSo.py | 11 +- resources/pyxbmct/__init__.py | 0 resources/pyxbmct/addonwindow.py | 786 ------------------ .../default/AddonWindow/ContentPanel.png | Bin 53334 -> 0 bytes .../AddonWindow/DialogCloseButton-focus.png | Bin 5216 -> 0 bytes .../default/AddonWindow/DialogCloseButton.png | Bin 4522 -> 0 bytes .../default/AddonWindow/SKINDEFAULT.jpg | Bin 125107 -> 0 bytes .../default/AddonWindow/dialogheader.png | Bin 4875 -> 0 bytes .../textures/default/Button/KeyboardKey.png | Bin 5929 -> 0 bytes .../textures/default/Button/KeyboardKeyNF.png | Bin 2968 -> 0 bytes .../textures/default/Edit/black-back2.png | Bin 23797 -> 0 bytes .../textures/default/Edit/button-focus.png | Bin 5605 -> 0 bytes .../textures/default/List/MenuItemFO.png | Bin 24951 -> 0 bytes .../textures/default/List/MenuItemNF.png | Bin 3173 -> 0 bytes .../default/RadioButton/MenuItemFO.png | Bin 24951 -> 0 bytes .../default/RadioButton/MenuItemNF.png | Bin 3173 -> 0 bytes .../default/RadioButton/radiobutton-focus.png | Bin 5190 -> 0 bytes .../RadioButton/radiobutton-nofocus.png | Bin 4442 -> 0 bytes .../textures/default/Slider/osd_slider_bg.png | Bin 3012 -> 0 bytes .../default/Slider/osd_slider_bg_2.png | Bin 2945 -> 0 bytes .../default/Slider/osd_slider_nib.png | Bin 2803 -> 0 bytes .../default/Slider/osd_slider_nibNF.png | Bin 2812 -> 0 bytes 25 files changed, 26 insertions(+), 814 deletions(-) delete mode 100644 resources/pyxbmct/__init__.py delete mode 100644 resources/pyxbmct/addonwindow.py delete mode 100644 resources/pyxbmct/textures/default/AddonWindow/ContentPanel.png delete mode 100644 resources/pyxbmct/textures/default/AddonWindow/DialogCloseButton-focus.png delete mode 100644 resources/pyxbmct/textures/default/AddonWindow/DialogCloseButton.png delete mode 100644 resources/pyxbmct/textures/default/AddonWindow/SKINDEFAULT.jpg delete mode 100644 resources/pyxbmct/textures/default/AddonWindow/dialogheader.png delete mode 100644 resources/pyxbmct/textures/default/Button/KeyboardKey.png delete mode 100644 resources/pyxbmct/textures/default/Button/KeyboardKeyNF.png delete mode 100644 resources/pyxbmct/textures/default/Edit/black-back2.png delete mode 100644 resources/pyxbmct/textures/default/Edit/button-focus.png delete mode 100644 resources/pyxbmct/textures/default/List/MenuItemFO.png delete mode 100644 resources/pyxbmct/textures/default/List/MenuItemNF.png delete mode 100644 resources/pyxbmct/textures/default/RadioButton/MenuItemFO.png delete mode 100644 resources/pyxbmct/textures/default/RadioButton/MenuItemNF.png delete mode 100644 resources/pyxbmct/textures/default/RadioButton/radiobutton-focus.png delete mode 100644 resources/pyxbmct/textures/default/RadioButton/radiobutton-nofocus.png delete mode 100644 resources/pyxbmct/textures/default/Slider/osd_slider_bg.png delete mode 100644 resources/pyxbmct/textures/default/Slider/osd_slider_bg_2.png delete mode 100644 resources/pyxbmct/textures/default/Slider/osd_slider_nib.png delete mode 100644 resources/pyxbmct/textures/default/Slider/osd_slider_nibNF.png diff --git a/addon.xml b/addon.xml index eb5e848..f22c288 100644 --- a/addon.xml +++ b/addon.xml @@ -8,6 +8,7 @@ + video diff --git a/controlcenter.py b/controlcenter.py index 7371021..7bd7476 100644 --- a/controlcenter.py +++ b/controlcenter.py @@ -24,7 +24,7 @@ import xbmcaddon import xbmc import xbmcgui from functions import getParameters, HistoryDB, Searchers, log -from resources.pyxbmct.addonwindow import * +import pyxbmct __settings__ = xbmcaddon.Addon(id='plugin.video.torrenter') __language__ = __settings__.getLocalizedString @@ -39,7 +39,7 @@ if len(sys.argv) > 1: else: params = {} -class ControlCenter(AddonDialogWindow): +class ControlCenter(pyxbmct.AddonDialogWindow): def __init__(self, title, addtime=None): super(ControlCenter, self).__init__(title) @@ -57,18 +57,17 @@ class ControlCenter(AddonDialogWindow): if not providers: self.db.set_providers(addtime, self.dic) else: - for searcher in self.keys: + for searcher in self.dic.keys(): self.dic[searcher] = False for searcher in providers: try: - if searcher in self.keys: + if searcher in self.dic.keys(): self.dic[searcher] = True except: - pass + log('self.dic[searcher] except') self.keys = self.dic.keys() self.placed, self.button_columns, self.last_column_row = self.place() - #print str((self.placed, self.button_columns, self.last_column_row)) else: self.button_columns=0 @@ -78,7 +77,7 @@ class ControlCenter(AddonDialogWindow): self.set_active_controls() self.set_navigation() # Connect a key action (Backspace) to close the window. - self.connect(ACTION_NAV_BACK, self.close) + self.connect(pyxbmct.ACTION_NAV_BACK, self.close) def place(self): placed = {} @@ -90,7 +89,6 @@ class ControlCenter(AddonDialogWindow): else: i += 1 placed[item] = (j, i) - #print item+str((j, i)) return placed, j, i def set_info_controls(self): @@ -103,7 +101,7 @@ class ControlCenter(AddonDialogWindow): self.radiobutton_top, self.radiobutton_bottom = [None, None, None], [None, None, None] for searcher in self.keys: place = self.placed[searcher] - self.radiobutton[searcher] = RadioButton(searcher) + self.radiobutton[searcher] = pyxbmct.RadioButton(searcher) self.placeControl(self.radiobutton[searcher], place[0], place[1]) self.radiobutton[searcher].setSelected(self.dic[searcher]) self.connect(self.radiobutton[searcher], self.radio_update) @@ -112,32 +110,32 @@ class ControlCenter(AddonDialogWindow): self.radiobutton_bottom[place[1]] = self.radiobutton[searcher] # Button - self.button_install = Button(__language__(30415)) + self.button_install = pyxbmct.Button(__language__(30415)) self.placeControl(self.button_install, 2 + self.button_columns, 0) self.connect(self.button_install, self.installSearcher) # Button - self.button_openserchset = Button(__language__(30416)) + self.button_openserchset = pyxbmct.Button(__language__(30416)) self.placeControl(self.button_openserchset, 2 + self.button_columns, 1) self.connect(self.button_openserchset, self.openSearcherSettings) # Button - self.button_clearstor = Button(__language__(30417)) + self.button_clearstor = pyxbmct.Button(__language__(30417)) self.placeControl(self.button_clearstor, 2 + self.button_columns, 2) self.connect(self.button_clearstor, self.clearStorage) # Button - self.button_openset = Button(__language__(30413)) + self.button_openset = pyxbmct.Button(__language__(30413)) self.placeControl(self.button_openset, 3 + self.button_columns, 0) self.connect(self.button_openset, self.openSettings) # Button - self.button_utorrent = Button(__language__(30414)) + self.button_utorrent = pyxbmct.Button(__language__(30414)) self.placeControl(self.button_utorrent, 3 + self.button_columns, 1) self.connect(self.button_utorrent, self.openUtorrent) # Button - self.button_close = Button(__language__(30412)) + self.button_close = pyxbmct.Button(__language__(30412)) self.placeControl(self.button_close, 3 + self.button_columns, 2) self.connect(self.button_close, self.close) @@ -171,8 +169,6 @@ class ControlCenter(AddonDialogWindow): ser = placed_keys[placed_values.index((place[0], place[1] - 1))] self.radiobutton[searcher].controlLeft(self.radiobutton[ser]) - #print str((self.button_columns, self.last_column_row)) - #print searcher if self.more_two_searcher: if place == (self.button_columns, self.last_column_row) and self.last_column_row < 2: ser = placed_keys[placed_values.index((place[0] - 1, place[1] + 1))] @@ -247,7 +243,10 @@ class ControlCenter(AddonDialogWindow): def openSearcherSettings(self): slist=Searchers().activeExternal() if len(slist)>0: - ret = xbmcgui.Dialog().select(__language__(30418), slist) + if len(slist) == 1: + ret = 0 + else: + ret = xbmcgui.Dialog().select(__language__(30418), slist) if ret > -1 and ret < len(slist): sid = slist[ret] Searcher=xbmcaddon.Addon(id='torrenter.searcher.'+sid) diff --git a/functions.py b/functions.py index 0f33e64..e0d0132 100644 --- a/functions.py +++ b/functions.py @@ -917,7 +917,6 @@ class HistoryDB: self.cur.execute('select providers from history where addtime="' + addtime + '"') x = self.cur.fetchone() self._close() - # print 'get_providers: '+str(x[0].split(',') if x and x[0]!='' else None) return x[0].split(',') if x and x[0] != '' else None def set_providers(self, addtime, providers): @@ -934,7 +933,7 @@ class HistoryDB: self._close() def change_providers(self, addtime, searcher): - self._connect() + #self._connect() providers = self.get_providers(addtime) keys = Searchers().dic().keys() if providers and len(providers) > 0: @@ -946,8 +945,8 @@ class HistoryDB: if i not in keys: providers.remove(i) self.set_providers(addtime, providers) - self.db.commit() - self._close() + #self.db.commit() + #self._close() def add(self, url): self._connect() diff --git a/resources/contenters/KickAssSo.py b/resources/contenters/KickAssSo.py index 3867011..b384404 100644 --- a/resources/contenters/KickAssSo.py +++ b/resources/contenters/KickAssSo.py @@ -82,21 +82,21 @@ class KickAssSo(Content.Content): return False def get_contentList(self, category, subcategory=None, apps_property=None): + self.debug = self.log contentList = [] url = self.get_url(category, subcategory, apps_property) response = self.makeRequest(url, headers=self.headers) if None != response and 0 < len(response): - # print response + self.debug(response) if category: contentList = self.mode(response) - # print str(contentList) + self.debug(str(contentList)) return contentList def mode(self, response): contentList = [] - # print str(result) num = 51 good_forums = ['TV', 'Anime', 'Movies'] regex = '''''' @@ -129,6 +129,7 @@ class KickAssSo(Content.Content): return contentList def get_info(self, url): + self.debug = self.log movieInfo = {} color = '[COLOR blue]%s:[/COLOR] %s\r\n' response = self.makeRequest(url, headers=self.headers) @@ -190,7 +191,5 @@ class KickAssSo(Content.Content): if i == 'IMDb link': movieInfo['kinopoisk'] = 'http://imdb.snick.ru/ratefor/02/tt%s.png' % info.get(i) - - # print str(info) - + self.debug(str(movieInfo)) return movieInfo diff --git a/resources/pyxbmct/__init__.py b/resources/pyxbmct/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/resources/pyxbmct/addonwindow.py b/resources/pyxbmct/addonwindow.py deleted file mode 100644 index c4825e9..0000000 --- a/resources/pyxbmct/addonwindow.py +++ /dev/null @@ -1,786 +0,0 @@ -# -*- coding: utf-8 -*- -# This is a "local" version of PyXBMCt to be used in standalone addons. -# -# PyXBMCt is a mini-framework for creating XBMC Python addons with arbitrary UI -# made of controls - decendants of xbmcgui.Control class. -# The framework uses image textures from XBMC Confluence skin. -# -# Licence: GPL v.3 http://www.gnu.org/licenses/gpl.html -# -## @package addonwindow -# PyXBMCt framework module - -import os - -import xbmc -import xbmcgui - - -# _addon = xbmcaddon.Addon() -_images = os.path.join(os.path.dirname(__file__), 'textures', 'default') - - -# Text alighnment constants. Mixed variants are obtained by bit OR (|) -ALIGN_LEFT = 0 -ALIGN_RIGHT = 1 -ALIGN_CENTER_X = 2 -ALIGN_CENTER_Y = 4 -ALIGN_CENTER = 6 -ALIGN_TRUNCATED = 8 -ALIGN_JUSTIFY = 10 - -# XBMC key action codes. -# More codes at https://github.com/xbmc/xbmc/blob/master/xbmc/guilib/Key.h -## ESC action -ACTION_PREVIOUS_MENU = 10 -## Backspace action -ACTION_NAV_BACK = 92 -## Left arrow key -ACTION_MOVE_LEFT = 1 -## Right arrow key -ACTION_MOVE_RIGHT = 2 -## Up arrow key -ACTION_MOVE_UP = 3 -## Down arrow key -ACTION_MOVE_DOWN = 4 -## Mouse wheel up -ACTION_MOUSE_WHEEL_UP = 104 -## Mouse wheel down -ACTION_MOUSE_WHEEL_DOWN = 105 -## Mouse drag -ACTION_MOUSE_DRAG = 106 -## Mouse move -ACTION_MOUSE_MOVE = 107 - - -def _set_textures(textures={}, kwargs={}): - """Set texture arguments for controls.""" - for texture in textures.keys(): - try: - kwargs[texture] - except KeyError: - kwargs[texture] = textures[texture] - - -class AddonWindowError(Exception): - """Custom exception.""" - pass - - -class Label(xbmcgui.ControlLabel): - """ControlLabel class. - - Parameters: - label: string or unicode - text string. - font: string - font used for label text. (e.g. 'font13') - textColor: hexstring - color of enabled label's label. (e.g. '0xFFFFFFFF') - disabledColor: hexstring - color of disabled label's label. (e.g. '0xFFFF3300') - alignment: integer - alignment of label - *Note, see xbfont.h - hasPath: bool - True=stores a path / False=no path. - angle: integer - angle of control. (+ rotates CCW, - rotates CW)" - - Note: - After you create the control, you need to add it to the window with placeControl(). - - Example: - self.label = Label('Status', angle=45) - """ - - def __new__(cls, *args, **kwargs): - return super(Label, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) - - -class FadeLabel(xbmcgui.ControlFadeLabel): - """Control that scrolls label text. - - Parameters: - font: string - font used for label text. (e.g. 'font13') - textColor: hexstring - color of fadelabel's labels. (e.g. '0xFFFFFFFF') - _alignment: integer - alignment of label - *Note, see xbfont.h - - Note: - After you create the control, you need to add it to the window with placeControl(). - - Example: - self.fadelabel = FadeLabel(textColor='0xFFFFFFFF') - """ - - def __new__(cls, *args, **kwargs): - return super(FadeLabel, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) - - -class TextBox(xbmcgui.ControlTextBox): - """ControlTextBox class. - - Parameters: - font: string - font used for text. (e.g. 'font13') - textColor: hexstring - color of textbox's text. (e.g. '0xFFFFFFFF') - - Note: - After you create the control, you need to add it to the window with placeControl(). - - Example: - self.textbox = TextBox(textColor='0xFFFFFFFF') - """ - - def __new__(cls, *args, **kwargs): - return super(TextBox, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) - - -class Image(xbmcgui.ControlImage): - """ControlImage class. - - Parameters: - filename: string - image filename. - colorKey: hexString - (example, '0xFFFF3300') - aspectRatio: integer - (values 0 = stretch (default), 1 = scale up (crops), 2 = scale down (black bars) - colorDiffuse: hexString - (example, '0xC0FF0000' (red tint)). - - Note: - After you create the control, you need to add it to the window with placeControl(). - - Example: - self.image = Image('d:\images\picture.jpg', aspectRatio=2) - """ - - def __new__(cls, *args, **kwargs): - return super(Image, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) - - -class Button(xbmcgui.ControlButton): - """ControlButton class. - - Parameters: - label: string or unicode - text string. - focusTexture: string - filename for focus texture. - noFocusTexture: string - filename for no focus texture. - textOffsetX: integer - x offset of label. - textOffsetY: integer - y offset of label. - alignment: integer - alignment of label - *Note, see xbfont.h - font: string - font used for label text. (e.g. 'font13') - textColor: hexstring - color of enabled button's label. (e.g. '0xFFFFFFFF') - disabledColor: hexstring - color of disabled button's label. (e.g. '0xFFFF3300') - angle: integer - angle of control. (+ rotates CCW, - rotates CW) - shadowColor: hexstring - color of button's label's shadow. (e.g. '0xFF000000') - focusedColor: hexstring - color of focused button's label. (e.g. '0xFF00FFFF') - - Note: - After you create the control, you need to add it to the window with placeControl(). - - Example: - self.button = Button('Status', font='font14') - """ - - def __new__(cls, *args, **kwargs): - textures = {'focusTexture': os.path.join(_images, 'Button', 'KeyboardKey.png'), - 'noFocusTexture': os.path.join(_images, 'Button', 'KeyboardKeyNF.png')} - _set_textures(textures, kwargs) - try: - kwargs['alignment'] - except KeyError: - kwargs['alignment'] = ALIGN_CENTER - return super(Button, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) - - -class RadioButton(xbmcgui.ControlRadioButton): - """ControlRadioButton class. - - Parameters: - label: string or unicode - text string. - focusTexture: string - filename for focus texture. - noFocusTexture: string - filename for no focus texture. - textOffsetX: integer - x offset of label. - textOffsetY: integer - y offset of label. - _alignment: integer - alignment of label - *Note, see xbfont.h - font: string - font used for label text. (e.g. 'font13') - textColor: hexstring - color of enabled radio button's label. (e.g. '0xFFFFFFFF') - disabledColor: hexstring - color of disabled radio button's label. (e.g. '0xFFFF3300') - angle: integer - angle of control. (+ rotates CCW, - rotates CW) - shadowColor: hexstring - color of radio button's label's shadow. (e.g. '0xFF000000') - focusedColor: hexstring - color of focused radio button's label. (e.g. '0xFF00FFFF') - focusOnTexture: string - filename for radio focused/checked texture. - noFocusOnTexture: string - filename for radio not focused/checked texture. - focusOffTexture: string - filename for radio focused/unchecked texture. - noFocusOffTexture: string - filename for radio not focused/unchecked texture. - Note: To customize RadioButton all 4 abovementioned textures need to be provided. - - Note: - After you create the control, you need to add it to the window with placeControl(). - - Example: - self.radiobutton = RadioButton('Status', font='font14') - """ - - def __new__(cls, *args, **kwargs): - if int(xbmc.getInfoLabel('System.BuildVersion')[:2]) >= 13: - textures = {'focusTexture': os.path.join(_images, 'RadioButton', 'MenuItemFO.png'), - 'noFocusTexture': os.path.join(_images, 'RadioButton', 'MenuItemNF.png'), - 'focusOnTexture': os.path.join(_images, 'RadioButton', 'radiobutton-focus.png'), - 'noFocusOnTexture': os.path.join(_images, 'RadioButton', 'radiobutton-focus.png'), - 'focusOffTexture': os.path.join(_images, 'RadioButton', 'radiobutton-nofocus.png'), - 'noFocusOffTexture': os.path.join(_images, 'RadioButton', 'radiobutton-nofocus.png')} - else: # This is for compatibility with Frodo and earlier versions. - textures = {'focusTexture': os.path.join(_images, 'RadioButton', 'MenuItemFO.png'), - 'noFocusTexture': os.path.join(_images, 'RadioButton', 'MenuItemNF.png'), - 'TextureRadioFocus': os.path.join(_images, 'RadioButton', 'radiobutton-focus.png'), - 'TextureRadioNoFocus': os.path.join(_images, 'RadioButton', 'radiobutton-nofocus.png')} - _set_textures(textures, kwargs) - return super(RadioButton, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) - - -class Edit(xbmcgui.ControlEdit): - """ - ControlEdit class. - - Edit(label[, font, textColor, disabledColor, alignment, focusTexture, noFocusTexture]) - - Parameters: - label : string or unicode - text string. - font : [opt] string - font used for label text. (e.g. 'font13') - textColor : [opt] hexstring - color of enabled label's label. (e.g. '0xFFFFFFFF') - disabledColor : [opt] hexstring - color of disabled label's label. (e.g. '0xFFFF3300') - _alignment : [opt] integer - alignment of label - *Note, see xbfont.h - focusTexture : [opt] string - filename for focus texture. - noFocusTexture : [opt] string - filename for no focus texture. - isPassword : [opt] bool - if true, mask text value. - - *Note, You can use the above as keywords for arguments and skip certain optional arguments. - Once you use a keyword, all following arguments require the keyword. - After you create the control, you need to add it to the window with palceControl(). - - example: - - self.edit = Edit('Status') - """ - - def __new__(cls, *args, **kwargs): - textures = {'focusTexture': os.path.join(_images, 'Edit', 'button-focus.png'), - 'noFocusTexture': os.path.join(_images, 'Edit', 'black-back2.png')} - _set_textures(textures, kwargs) - return super(Edit, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) - - -class List(xbmcgui.ControlList): - """ControlList class. - - Parameters: - font: string - font used for items label. (e.g. 'font13') - textColor: hexstring - color of items label. (e.g. '0xFFFFFFFF') - buttonTexture: string - filename for no focus texture. - buttonFocusTexture: string - filename for focus texture. - selectedColor: integer - x offset of label. - _imageWidth: integer - width of items icon or thumbnail. - _imageHeight: integer - height of items icon or thumbnail. - _itemTextXOffset: integer - x offset of items label. - _itemTextYOffset: integer - y offset of items label. - _itemHeight: integer - height of items. - _space: integer - space between items. - _alignmentY: integer - Y-axis alignment of items label - *Note, see xbfont.h - - Note: - After you create the control, you need to add it to the window with placeControl(). - - Example: - self.cList = List('font14', space=5) - """ - - def __new__(cls, *args, **kwargs): - textures = {'buttonTexture': os.path.join(_images, 'List', 'MenuItemNF.png'), - 'buttonFocusTexture': os.path.join(_images, 'List', 'MenuItemFO.png')} - _set_textures(textures, kwargs) - return super(List, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) - - -class Slider(xbmcgui.ControlSlider): - """ControlSlider class. - - Parameters: - textureback: string - image filename. - texture: string - image filename. - texturefocus: string - image filename. - - Note: - After you create the control, you need to add it to the window with placeControl(). - - Example: - self.slider = Slider() - """ - - def __new__(cls, *args, **kwargs): - textures = {'textureback': os.path.join(_images, 'Slider', 'osd_slider_bg.png'), - 'texture': os.path.join(_images, 'Slider', 'osd_slider_nibNF.png'), - 'texturefocus': os.path.join(_images, 'Slider', 'osd_slider_nib.png')} - _set_textures(textures, kwargs) - return super(Slider, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) - - -class _AbstractWindow(object): - """ - Top-level control window. - - The control windows serves as a parent widget for other XBMC UI controls - much like Tkinter.Tk or PyQt QWidget class. - This is an abstract class which is not supposed to be instantiated directly - and will raise exeptions. - - This class is a basic "skeleton" for a control window. - """ - - def __init__(self): - """Constructor method.""" - self.actions_connected = [] - self.controls_connected = [] - - def setGeometry(self, width_, height_, rows_, columns_, pos_x=-1, pos_y=-1): - """ - Set width, height, Grid layout, and coordinates (optional) for a new control window. - - Parameters: - width_, height_: widgh and height of the created window. - rows_, columns_: rows and colums of the Grid layout to place controls on. - pos_x, pos_y (optional): coordinates of the top left corner of the window. - If pos_x and pos_y are not privided, the window will be placed - at the center of the screen. - Example: - self.setGeometry(400, 500, 5, 4) - """ - self.width = width_ - self.height = height_ - self.rows = rows_ - self.columns = columns_ - if pos_x > 0 and pos_y > 0: - self.x = pos_x - self.y = pos_y - else: - self.x = 640 - self.width / 2 - self.y = 360 - self.height / 2 - self.setGrid() - - def setGrid(self): - """ - Set window grid layout of rows * columns. - This is a helper method not to be called directly. - """ - self.grid_x = self.x - self.grid_y = self.y - self.tile_width = self.width / self.columns - self.tile_height = self.height / self.rows - - def placeControl(self, control, row, column, rowspan=1, columnspan=1, pad_x=5, pad_y=5): - """ - Place a control within the window grid layout. - - pad_x, pad_y: horisontal and vertical padding for control's - size and aspect adjustments. Negative values can be used - to make a control overlap with grid cells next to it, if necessary. - Raises AddonWindowError if a grid has not yet been set. - Example: - self.placeControl(self.label, 0, 1) - """ - try: - control_x = (self.grid_x + self.tile_width * column) + pad_x - control_y = (self.grid_y + self.tile_height * row) + pad_y - control_width = self.tile_width * columnspan - 2 * pad_x - control_height = self.tile_height * rowspan - 2 * pad_y - except AttributeError: - raise AddonWindowError('Window geometry is not defined! Call setGeometry first.') - control.setPosition(control_x, control_y) - control.setWidth(control_width) - control.setHeight(control_height) - self.addControl(control) - self.setAnimation(control) - - def getX(self): - """Get X coordinate of the top-left corner of the window.""" - try: - return self.x - except AttributeError: - raise AddonWindowError('Window geometry is not defined! Call setGeometry first.') - - def getY(self): - """Get Y coordinate of the top-left corner of the window.""" - try: - return self.y - except AttributeError: - raise AddonWindowError('Window geometry is not defined! Call setGeometry first.') - - def getWindowWidth(self): - """Get window width.""" - try: - return self.width - except AttributeError: - raise AddonWindowError('Window geometry is not defined! Call setGeometry first.') - - def getWindowHeight(self): - """Get window height.""" - try: - return self.height - except AttributeError: - raise AddonWindowError('Window geometry is not defined! Call setGeometry first.') - - def getRows(self): - """ - Get grid rows count. - Raises AddonWindowError if a grid has not yet been set. - """ - try: - return self.rows - except AttributeError: - raise AddonWindowError('Grid layot is not set! Call setGeometry first.') - - def getColumns(self): - """ - Get grid columns count. - Raises AddonWindowError if a grid has not yet been set. - """ - try: - return self.columns - except AttributeError: - raise AddonWindowError('Grid layout is not set! Call setGeometry first.') - - def connect(self, event, function): - """ - Connect an event to a function. - - An event can be an inctance of a Control object or an integer key action code. - Several basic key action codes are provided by PyXBMCT. More action codes can be found at - https://github.com/xbmc/xbmc/blob/master/xbmc/guilib/Key.h - - You can connect the following Controls: Button, RadioButton and List. Other Controls do not - generate any control events when activated so their connections won't work. - To catch Slider events you need to connect the following key actions: - ACTION_MOVE_LEFT, ACTION_MOVE_RIGHT and ACTION_MOUSE_DRAG, and do a check - whether the Slider is focused. - - "function" parameter is a function or a method to be executed. Note that you must provide - a function object [without brackets ()], not a function call! - lambda can be used as a function to call another function or method with parameters. - - Examples: - self.connect(self.exit_button, self.close) - or - self.connect(ACTION_NAV_BACK, self.close) - """ - try: - self.disconnect(event) - except AddonWindowError: - if type(event) == int: - self.actions_connected.append([event, function]) - else: - self.controls_connected.append([event, function]) - - def connectEventList(self, events, function): - """ - Connect a list of controls/action codes to a function. - See connect docstring for more info. - """ - [self.connect(event, function) for event in events] - - def disconnect(self, event): - """ - Disconnect an event from a function. - - An event can be an inctance of a Control object or an integer key action code - which has previously been connected to a function or a method. - Raises AddonWindowError if an event is not connected to any function. - - Examples: - self.disconnect(self.exit_button) - or - self.disconnect(ACTION_NAV_BACK) - """ - if type(event) == int: - event_list = self.actions_connected - else: - event_list = self.controls_connected - for index in range(len(event_list)): - if event == event_list[index][0]: - event_list.pop(index) - break - else: - raise AddonWindowError('The action or control %s is not connected!' % event) - - def disconnectEventList(self, events): - """ - Disconnect a list of controls/action codes from functions. - See disconnect docstring for more info. - Raises AddonWindowError if at least one event in the list - is not connected to any function. - """ - [self.disconnect(event) for event in events] - - def executeConnected(self, event, connected_list): - """ - Execute a connected event (an action or a control). - This is a helper method not to be called directly. - """ - for item in connected_list: - if event == item[0]: - item[1]() - break - - def setAnimation(self, control): - """ - This method is called to set animation properties for all controls - added to the current addon window instance - both built-in controls - (window background, title bar etc.) and controls added with placeControl(). - It receives a control instance as the 2nd positional argument (besides self). - By default the method does nothing, i.e. no animation is set for controls. - To add animation you need to re-implement this menthod in your child class. - - E.g: - def setAnimation(self, control): - control.setAnimations([('WindowOpen', 'effect=fade start=0 end=100 time=1000',), - ('WindowClose', 'effect=fade start=100 end=0 time=1000',)]) - """ - pass - - -class _AddonWindow(_AbstractWindow): - """ - Top-level control window. - - The control windows serves as a parent widget for other XBMC UI controls - much like Tkinter.Tk or PyQt QWidget class. - This is an abstract class which is not supposed to be instantiated directly - and will raise exeptions. It is designed to be implemented in a grand-child class - with the second inheritance from xbmcgui.Window or xbmcgui.WindowDialog - in a direct child class. - - This class provides a control window with a background and a header - similar to top-level widgets of desktop UI frameworks. - """ - - def __init__(self, title=''): - """Constructor method.""" - super(_AddonWindow, self).__init__() - self.setFrame(title) - - def setFrame(self, title): - """ - Define paths to images for window background and title background textures, - and set control position adjustment constants used in setGrid. - This is a helper method not to be called directly. - """ - # Window background image - self.background_img = os.path.join(_images, 'AddonWindow', 'ContentPanel.png') - # Background for a window header - self.title_background_img = os.path.join(_images, 'AddonWindow', 'dialogheader.png') - # Horisontal adjustment for a header background if the main background has transparent edges. - self.X_MARGIN = 5 - # Vertical adjustment for a header background if the main background has transparent edges - self.Y_MARGIN = 5 - # Header position adjustment if the main backround has visible borders. - self.Y_SHIFT = 4 - # The height of a window header (for the title background and the title label). - self.HEADER_HEIGHT = 35 - self.background = xbmcgui.ControlImage(-10, -10, 1, 1, self.background_img) - self.addControl(self.background) - self.setAnimation(self.background) - self.title_background = xbmcgui.ControlImage(-10, -10, 1, 1, self.title_background_img) - self.addControl(self.title_background) - self.setAnimation(self.title_background) - self.title_bar = xbmcgui.ControlLabel(-10, -10, 1, 1, title, alignment=ALIGN_CENTER, textColor='0xFFFFA500', - font='font13_title') - self.addControl(self.title_bar) - self.setAnimation(self.title_bar) - self.window_close_button = xbmcgui.ControlButton(-100, -100, 60, 30, '', - focusTexture=os.path.join(_images, 'AddonWindow', - 'DialogCloseButton-focus.png'), - noFocusTexture=os.path.join(_images, 'AddonWindow', - 'DialogCloseButton.png')) - self.addControl(self.window_close_button) - self.setAnimation(self.window_close_button) - - def setGeometry(self, width_, height_, rows_, columns_, pos_x=-1, pos_y=-1, padding=5): - """ - Set width, height, Grid layout, and coordinates (optional) for a new control window. - - Parameters: - width_, height_: widgh and height of the created window. - rows_, columns_: rows and colums of the Grid layout to place controls on. - pos_x, pos_y (optional): coordinates of the top left corner of the window. - If pos_x and pos_y are not privided, the window will be placed - at the center of the screen. - padding (optional): padding between outer edges of the window and - controls placed on it. - Example: - self.setGeometry(400, 500, 5, 4) - """ - self.win_padding = padding - super(_AddonWindow, self).setGeometry(width_, height_, rows_, columns_, pos_x, pos_y) - self.background.setPosition(self.x, self.y) - self.background.setWidth(self.width) - self.background.setHeight(self.height) - self.title_background.setPosition(self.x + self.X_MARGIN, self.y + self.Y_MARGIN + self.Y_SHIFT) - self.title_background.setWidth(self.width - 2 * self.X_MARGIN) - self.title_background.setHeight(self.HEADER_HEIGHT) - self.title_bar.setPosition(self.x + self.X_MARGIN, self.y + self.Y_MARGIN + self.Y_SHIFT) - self.title_bar.setWidth(self.width - 2 * self.X_MARGIN) - self.title_bar.setHeight(self.HEADER_HEIGHT) - self.window_close_button.setPosition(self.x + self.width - 70, self.y + self.Y_MARGIN + self.Y_SHIFT) - - def setGrid(self): - """ - Set window grid layout of rows * columns. - This is a helper method not to be called directly. - """ - self.grid_x = self.x + self.X_MARGIN + self.win_padding - self.grid_y = self.y + self.Y_MARGIN + self.Y_SHIFT + self.HEADER_HEIGHT + self.win_padding - self.tile_width = (self.width - 2 * (self.X_MARGIN + self.win_padding)) / self.columns - self.tile_height = ( - self.height - self.HEADER_HEIGHT - self.Y_SHIFT - 2 * ( - self.Y_MARGIN + self.win_padding)) / self.rows - - def setWindowTitle(self, title=''): - """ - Set window title. - This method must be called AFTER (!!!) setGeometry(), - otherwise there is some werid bug with all skin text labels set to the 'title' text. - Example: - self.setWindowTitle('My Cool Addon') - """ - self.title_bar.setLabel(title) - - def getWindowTitle(self): - """Get window title.""" - return self.title_bar.getLabel() - - -class _FullWindow(xbmcgui.Window): - """An abstract class to define window event processing.""" - - def onAction(self, action): - """ - Catch button actions. - Note that, despite being compared to an integer, - action is an instance of xbmcgui.Action class. - """ - if action == ACTION_PREVIOUS_MENU: - self.close() - else: - self.executeConnected(action, self.actions_connected) - - def onControl(self, control): - """ - Catch activated controls. - Control is an instance of xbmcgui.Control class. - """ - if control == self.window_close_button: - self.close() - else: - self.executeConnected(control, self.controls_connected) - - -class _DialogWindow(xbmcgui.WindowDialog): - """An abstract class to define window event processing.""" - - def onAction(self, action): - """ - Catch button actions. - Note that, despite being compared to an integer, - action is an instance of xbmcgui.Action class. - """ - if action == ACTION_PREVIOUS_MENU: - self.close() - else: - self.executeConnected(action, self.actions_connected) - - def onControl(self, control): - """ - Catch activated controls. - Control is an instance of xbmcgui.Control class. - """ - if control == self.window_close_button: - self.close() - else: - self.executeConnected(control, self.controls_connected) - - -class BlankFullWindow(_FullWindow, _AbstractWindow): - """ - Addon UI container with a solid background. - This is a blank window with a black background and without any elements whatsoever. - The decoration and layout are completely up to an addon developer. - The window controls can hide under video or music visualization. - Window ID can be passed on class instantiation an agrument - but __init__ must have the 2nd fake argument, e.g: - - def __init__(self, *args) - - Minimal example: - - addon = MyAddon('My Cool Addon') - addon.setGeometry(400, 300, 4, 3) - addon.doModal() - """ - pass - - -class BlankDialogWindow(_DialogWindow, _AbstractWindow): - """ - Addon UI container with a transparent background. - This is a blank window with a transparent background and without any elements whatsoever. - The decoration and layout are completely up to an addon developer. - The window controls are always displayed over video or music visualization. - Minimal example: - - addon = MyAddon('My Cool Addon') - addon.setGeometry(400, 300, 4, 3) - addon.doModal() - """ - pass - - -class AddonFullWindow(_FullWindow, _AddonWindow): - """ - Addon UI container with a solid background. - Control window is displayed on top of the main background image - self.main_bg. - Video and music visualization are displayed unhindered. - Window ID can be passed on class instantiation as the 2nd positional agrument - but __init__ must have the 3rd fake argument, e.g: - - def __init__(self, title='', *args) - - Minimal example: - - addon = MyAddon('My Cool Addon') - addon.setGeometry(400, 300, 4, 3) - addon.doModal() - """ - - def __new__(cls, title='', *args, **kwargs): - return super(AddonFullWindow, cls).__new__(cls, *args, **kwargs) - - def setFrame(self, title): - """ - Set the image for for the fullscreen background. - """ - # Image for the fullscreen background. - self.main_bg_img = os.path.join(_images, 'AddonWindow', 'SKINDEFAULT.jpg') - # Fullscreen background image control. - self.main_bg = xbmcgui.ControlImage(1, 1, 1280, 720, self.main_bg_img) - self.addControl(self.main_bg) - super(AddonFullWindow, self).setFrame(title) - - def setBackground(self, image=''): - """ - Set the main bacground to an image file. - image: path to an image file as str. - Example: - self.setBackground('d:\images\bacground.png') - """ - self.main_bg.setImage(image) - - -class AddonDialogWindow(_DialogWindow, _AddonWindow): - """ - Addon UI container with a transparent background. - Control window is displayed on top of XBMC UI, - including video an music visualization! - Minimal example: - - addon = MyAddon('My Cool Addon') - addon.setGeometry(400, 300, 4, 3) - addon.doModal() - """ - pass diff --git a/resources/pyxbmct/textures/default/AddonWindow/ContentPanel.png b/resources/pyxbmct/textures/default/AddonWindow/ContentPanel.png deleted file mode 100644 index eb022d62fba3d83f3ecef3aac6c071b20884fb72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53334 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Ì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 diff --git a/resources/pyxbmct/textures/default/AddonWindow/DialogCloseButton-focus.png b/resources/pyxbmct/textures/default/AddonWindow/DialogCloseButton-focus.png deleted file mode 100644 index fdde65cdf987a59197b160ad14092b51da5fd4e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5216 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 IM6N<$f_r^~X8-^I diff --git a/resources/pyxbmct/textures/default/AddonWindow/SKINDEFAULT.jpg b/resources/pyxbmct/textures/default/AddonWindow/SKINDEFAULT.jpg deleted file mode 100644 index 3d5b572bd46fc88c8ed48a5c15cb5351b8500e1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125107 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�(*r?3uhj$FK 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Îi9dQEz;MWq_bJxCPbGFUhGPfzo5ApSi0Ct%r^* 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

-cd^| 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 L4~l}C{x|bKRFD`n diff --git a/resources/pyxbmct/textures/default/AddonWindow/dialogheader.png b/resources/pyxbmct/textures/default/AddonWindow/dialogheader.png deleted file mode 100644 index af7ba85beb3d021cc93127f2f5281bde2586aeb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4875 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 diff --git a/resources/pyxbmct/textures/default/Button/KeyboardKey.png b/resources/pyxbmct/textures/default/Button/KeyboardKey.png deleted file mode 100644 index 5c8b2bf94f3e3c5c4218892d3a6f39760b315105..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5929 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 LNkvXXu0mjfjr&mz diff --git a/resources/pyxbmct/textures/default/Button/KeyboardKeyNF.png b/resources/pyxbmct/textures/default/Button/KeyboardKeyNF.png deleted file mode 100644 index 077777fdb13b58368e7ab3a54a19405857e04f04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2968 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 diff --git a/resources/pyxbmct/textures/default/Edit/black-back2.png b/resources/pyxbmct/textures/default/Edit/black-back2.png deleted file mode 100644 index 399e2d04c51e8131890c010d6b59eea293b4b88a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23797 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 diff --git a/resources/pyxbmct/textures/default/Edit/button-focus.png b/resources/pyxbmct/textures/default/Edit/button-focus.png deleted file mode 100644 index 831dd453811ace00242123419945ad44605b9184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5605 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 diff --git a/resources/pyxbmct/textures/default/List/MenuItemFO.png b/resources/pyxbmct/textures/default/List/MenuItemFO.png deleted file mode 100644 index 14230c064646e262334327b46ff7e98c50d61a96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24951 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 Qd#3@Iu1|%15j}MUjP6A diff --git a/resources/pyxbmct/textures/default/RadioButton/MenuItemFO.png b/resources/pyxbmct/textures/default/RadioButton/MenuItemFO.png deleted file mode 100644 index 14230c064646e262334327b46ff7e98c50d61a96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24951 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 Qd#3@Iu1|%15j}MUjP6A diff --git a/resources/pyxbmct/textures/default/RadioButton/radiobutton-focus.png b/resources/pyxbmct/textures/default/RadioButton/radiobutton-focus.png deleted file mode 100644 index bcb4cb5ababa656449673975b816e821298b3180..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5190 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 AT>t<8 diff --git a/resources/pyxbmct/textures/default/RadioButton/radiobutton-nofocus.png b/resources/pyxbmct/textures/default/RadioButton/radiobutton-nofocus.png deleted file mode 100644 index 282396db622014b9382cd3e3012d2217346ad207..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4442 zcmV-g5vA^lP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000JsNkl=1R)Cr5d>Y>T^DgBF4_u8>7tvqo7PJ0V1r3Ys@Arq8a0}j`Fve?u3R3m8Iwsw z>V?aDkGYfi{qH^Z+;h%LCP@-`nwyiSygd`}q#Nh@2Rb@B1b_g@_)gN1Yy;3jG9h_S zRVVFURJEq6LQ>A2J^SPY7(4+q0q7yQ8o+XrEhH-d%Bor>SteN`Ii{+ks(Ov&9aXK0 z$eg@LX0~1^o6V|oE)QTmfE6SKKti%YvTD%27ge=HvZSg-RV|X7GBKm7TI%obPZmT# z9LE6A>6}{+;6(tEg7@9eddc96s`^lX7ZgQNQB`lN>bR;_j~zQUe*)q-ZUOMRb8bTb zo`x@zELxxPCS>px4tQr|C;n z6<&fcF8cPQjM}3=R(ufAy%poqC@3hj#DYy~u>uyqhJN z@s42U&Yj7u1;lZz05$?xmx8|q;EUnm;jz?LAR;Ovc@gPMefF1#+z^q9h}6Ol_U+pT zK4_Vs!<;~I+qP}9JBb0Tng;%#k&%(lQt%Lwr6RIUL|&N&UPNS>h`c5uZ-_{TeMdw@ z4jed8HCVAj5Z2pB>a12Eo6WWX_yj;4z)y~hjC`7!fOZjCHOq78l88)r^E!O^Fi5r< zyl+*KH@9rrQmcCfve|3~z^f_v8p-ccv%Yo?@FF5>L}Z13*t2I()qum+MzZzPsZ;fv z5P)U?Z+drW@S{URLxo`2auI26Ks>hCx`>GE*s){M%!ni->s?5gJ2L=QS|BC> zYUbz91jAZHB-g;8a%C8ok(@GcwQD=cmgxdNH_hw|fVBa9mE_pKz`*Tb*eYp!%ln(H zTepteK8Q$003wokl9_r0D9Pmke3|4A!H}i~nNGTOg`UYy5@Y5?!esI49oY7L^w zvZ`JQKGu285RsZp3E(4=&(*U6YT#vy*)ON;f5Gx}lJ|l=pa7a@OeskwKG`rK_nuh7 zPEOhED*y$68CO76r-DqXsH*Xk5&)pv!<%K)>M@~7%Z^HxyM_nW#QL;!qlFbbenkATE#HAPh|Mp0CXq9`<@s%2M= zZbPXJyx7A7Z~z7YB=riouBxRdiu`7-Zr{GWH5fM9VED3#-1QHILg7Q73>bVBz;8W0 zJu?e9efqSh>U}e#ux=BsLPbP|8z^AVZ{9+o&`Pq$>^@`B@kIdl>rQBF6>bIsDkN*Y zy}eDTz0imaeJN%8A6c!{!`A@(q4c@1EuCK2zJPpT0_wLKxF@U#H@Kpfc{1<#(mAU=<_lr3MHF#&P4R&87dDoW}eGdu(64p{v*LMM| z0nn0y7XV*6=Z15++}vxU2M-?fBASDu6N4ZtVfp?+BtVM zm&?@}{(j*2@#8+>X}5P^A$XL^o}wU<3?oWSHe?Jhm{{DVP zvIW30Tam|tw>{+HuNe4fKA*2F*gLY5Cr^s)h1g0SO93njpd-IR9^P+$0QUe~25`|i zcO5`EpU*GsOFrMuoH-+A3Lx15AZO;)X3qlPKFRw4CII{a;0A!2bFS9i-94w@&pi8I giDv@-=K}s60REWjhyVZp07*qoM6N<$g3v`j*8l(j diff --git a/resources/pyxbmct/textures/default/Slider/osd_slider_bg.png b/resources/pyxbmct/textures/default/Slider/osd_slider_bg.png deleted file mode 100644 index 4b5160b0e8cac68ecd4b466b2386ed1d407875f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3012 zcmV;#3p@0QP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0002*NklH-BxXA;Ev=1(?RFNM;4wVf9)s6;3Tw|{gU!T5qpLBl z`__EFWC|EU{yYX42vy(rNEtN|u>_XDrnHQvz#7;A-)4NDjBVSVEJwsKW9{{+tQ?&B z*MoCXZnLW&wpo{U&8qZIuJkWT|Kh>pFynJF-jm^F8Jj!8ew4Y&t+~vt6EiLQx@27X zcMlfSjL*qPri?z;<(yM;aLU0c{kE#>I;)^RbN&(j{B3;z%z&Y#(yK+prPX_2+W?=y zmt|5iqZ*i72PHJGfsu7k#ye-_FLTPuPf1Ga00030{{sNf_%AZ`^=*j&0000KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00022Nkl(BeY{|B+8US8=)c}CS3sBE;KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0000UNklKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0000dNkl Date: Sat, 26 Nov 2016 12:06:04 +0300 Subject: [PATCH 024/126] search window --- addon.xml | 2 +- changelog.txt | 7 ++- searchwindow.py | 113 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 searchwindow.py diff --git a/addon.xml b/addon.xml index f22c288..bdfa829 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index e39aab4..8b93823 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,14 +1,17 @@ English changelog at http://bit.ly/1MfSVUP +[B]Version 2.5.5[/B] +[+] Control Center: Исправлена работа выбора трекеров для определенного запроса + [B]Version 2.5.4[/B] -Исправлено "открыть без возврата". Спасибо viorel-m. +[+] Исправлено "открыть без возврата". Спасибо viorel-m. [B]Version 2.5.3[/B] [+] Венгерский язык [+] Совместимость с Коди 17 [B]Version 2.5.2[/B] -[+] Упорядочивание по разверу файла +[+] Упорядочивание по размеру файла [B]Version 2.5.1[/B] [+] Исправлена работа с кодировками diff --git a/searchwindow.py b/searchwindow.py new file mode 100644 index 0000000..f879349 --- /dev/null +++ b/searchwindow.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +''' + Torrenter v2 plugin for XBMC/Kodi + Copyright (C) 2012-2015 Vadim Skorba v1 - DiMartino v2 + https://forums.tvaddons.ag/addon-releases/29224-torrenter-v2.html + + 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 . +''' +import os +import xbmc +import xbmcgui +import xbmcaddon +import pyxbmct.addonwindow as pyxbmct + +_addon = xbmcaddon.Addon() +_path = _addon.getAddonInfo("path") +__settings__ = xbmcaddon.Addon(id='plugin.video.torrenter') +__version__ = __settings__.getAddonInfo('version') +__plugin__ = __settings__.getAddonInfo('name') + " v." + __version__ + + +class MultiChoiceDialog(pyxbmct.AddonDialogWindow): + def __init__(self, title="", filesList=None): + super(MultiChoiceDialog, self).__init__(title) + self.setGeometry(1280, 720, 9, 16) + self.selected = [] + self.set_controls() + self.connect_controls() + self.filesList = filesList + self.items() + self.set_navigation() + + def set_controls(self): + self.input_search = pyxbmct.Edit("Search"+"...") + self.placeControl(self.input_search, 0, 0, 1, 5) + self.button_search = pyxbmct.Button("Search") + self.placeControl(self.button_search, 0, 5, 1, 1) + self.button_keyboard = pyxbmct.Button("keyboard") + self.placeControl(self.button_keyboard, 0, 6, 1, 1) + + self.listing = pyxbmct.List(_imageWidth=40, _imageHeight=40, _itemTextXOffset=10, _itemTextYOffset=2, _itemHeight=40, _space=2, _alignmentY=4) + self.placeControl(self.listing, 1, 0, 8, 15) + + + def connect_controls(self): + self.connect(self.listing, self.press) + #self.connect(self.ok_button, self.ok) + #self.connect(self.cancel_button, self.close) + + def set_navigation(self): + self.listing.controlUp(self.input_search) + self.listing.controlDown(self.input_search) + self.input_search.setNavigation(self.listing, self.listing, self.button_keyboard, self.button_search) + self.button_search.setNavigation(self.listing, self.listing, self.input_search, self.button_keyboard) + self.button_keyboard.setNavigation(self.listing, self.listing, self.button_search, self.input_search) + if self.listing.size(): + self.setFocus(self.listing) + else: + self.setFocus(self.input_search) + + def items(self): + self.listing.reset() + for (order, seeds, leechers, size, title, link, image) in self.filesList: + title = titleMake(seeds, leechers, size, title) + log(title) + list_item = xbmcgui.ListItem(title, "", image, '', '') + self.listing.addItem(list_item) + + def press(self): + self.filesList = sorted(self.filesList, key=lambda x: x[4], reverse=True) + self.items() + +def log(msg): + try: + xbmc.log("### [%s]: %s" % (__plugin__,msg,), level=xbmc.LOGNOTICE ) + except UnicodeEncodeError: + xbmc.log("### [%s]: %s" % (__plugin__,msg.encode("utf-8", "ignore"),), level=xbmc.LOGNOTICE ) + except: + xbmc.log("### [%s]: %s" % (__plugin__,'ERROR LOG',), level=xbmc.LOGNOTICE ) + +def titleMake(seeds, leechers, size, title): + + #AARRGGBB + clGreen = '[COLOR FF008000]%s[/COLOR]' + clDodgerblue = '[COLOR FF1E90FF]%s[/COLOR]' + clDimgray = '[COLOR FF696969]%s[/COLOR]' + clWhite = '[COLOR FFFFFFFF]%s[/COLOR]' + clAliceblue = '[COLOR FFF0F8FF]%s[/COLOR]' + clRed = '[COLOR FFFF0000]%s[/COLOR]' + + title = title.replace('720p', '[B]720p[/B]').replace('1080p', '[B]1080p[/B]') + title = clWhite % title + second = '\r\n[I](%s) [S/L: %d/%d] [/I]' % (size, seeds, leechers) + title += ' ' + second + return title + +if __name__ == "__main__": + items = [(1919, 1919, 52, u'102.66 MiB', u'South.Park.S20E06.HDTV.x264-FUM[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:0792ea51bc16a19893871197fa927ecec7ca25aa&dn=South.Park.S20E06.HDTV.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (1545, 1545, 31, u'97.26 MiB', u'South.Park.S20E05.HDTV.x264-KILLERS[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:437487c32ce82f050cdbfccfc04e4e20aca0d4cb&dn=South.Park.S20E05.HDTV.x264-KILLERS%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (1265, 1265, 75, u'89.69 MiB', u'South.Park.S20E07.HDTV.x264-FLEET', u'ThePirateBay::magnet:?xt=urn:btih:a122b0b79c4cbacea959e6e032ab540674ce49eb&dn=South.Park.S20E07.HDTV.x264-FLEET&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (1083, 1083, 9, u'99.5 MiB', u'South.Park.S20E03.PROPER.HDTV.x264-KILLERS[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:ed2806f33629ec637caeabcc25ae1e70d5971ebe&dn=South.Park.S20E03.PROPER.HDTV.x264-KILLERS%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (429, 429, 19, u'85.08 MiB', u'South.Park.S20E08.WEBRip.x264-FUM[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:988728720702c55fd1d19cde10f9af720ed934eb&dn=South.Park.S20E08.WEBRip.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (311, 311, 229, u'251.67 MiB', u'South.Park.S20E08.1080p.HDTV.x264[state]', u'ThePirateBay::magnet:?xt=urn:btih:a5fa25dfccfa43723e34466b47fed2f89dd34072&dn=South.Park.S20E08.1080p.HDTV.x264%5Bstate%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (272, 272, 51, '6.08 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DL (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9, \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-10-seriya-1-iz-10-t111662.html?id=602710', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (237, 237, 6, u'367.96 MiB', u'South.Park.S20E03.720p.HDTV.x264-AVS[rarbg]', u'ThePirateBay::magnet:?xt=urn:btih:a6fd5218db8b5445981ce1466a501ae1e72fc538&dn=South.Park.S20E03.720p.HDTV.x264-AVS%5Brarbg%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (206, 206, 127, '4.1 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) (L0cDoG)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-8-seriya-iz-10-south-park-t141746.html?id=725943', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (168, 168, 3, u'184.19 MiB', u'South.Park.S20E08.Members.Only.720p.WEBRip.AAC2.0.H.264.mkv', u'ThePirateBay::magnet:?xt=urn:btih:0647e29a5a9b96f91f97f73bb010e8eb9aca66b7&dn=South.Park.S20E08.Members.Only.720p.WEBRip.AAC2.0.H.264.mkv&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (154, 154, 62, '6.51 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-5-seriya-iz-10-south-park-t137088.html?id=727333', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (154, 154, 87, '3.33 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) (L0cDoG)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-8-seriya-iz-10-south-park-t141747.html?id=725945', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (140, 140, 5, u'81.54 MiB', u'South Park S20E08 720p Uncensored Web-DL EN-Sub x264-[MULVAcoded', u'ThePirateBay::magnet:?xt=urn:btih:2491997192df91dd3581db848f0c998d90b1ea09&dn=South+Park+S20E08+720p+Uncensored+Web-DL+EN-Sub+x264-%5BMULVAcoded&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (135, 135, 44, '2.13 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-5-seriya-iz-10-south-park-t137089.html?id=727335', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (118, 118, 12, u'1.38 GiB', u'South.Park.Season.17.Complete.UNCENSORED.720p.WEB-DL.x264.AAC', u'ThePirateBay::magnet:?xt=urn:btih:e92aa604285e189749bb2ce7d5e90e2dca726192&dn=South.Park.Season.17.Complete.UNCENSORED.720p.WEB-DL.x264.AAC&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (116, 116, 2, u'843.03 MiB', u'South.Park.S20E06.Fort.Collins.UNCENSORED.1080p.WEB-DL.H.264-YFN', u'ThePirateBay::magnet:?xt=urn:btih:1c4f30359538f253efc5a292101abb8520406131&dn=South.Park.S20E06.Fort.Collins.UNCENSORED.1080p.WEB-DL.H.264-YFN&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (113, 113, 226, '90.71 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 1-19 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-267 \xd0\xb8\xd0\xb7 267) [1997-2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEBDLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - "Paramount Comedy" ex-MTV]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-18-seriya-1-iz-10-t112158.html?id=771968', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (112, 56, 22, '2,21 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2016) HDTVRip (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-8 \xd0\xb8\xd0\xb7 10) L0cDoG (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=887776&1064662', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (109, 109, 2, u'348.34 MiB', u'South Park 20x07 (720p-HDTV-x264-AVS)[VTV]', u'ThePirateBay::magnet:?xt=urn:btih:06cae396d7276a2e81fe4bd9ca251d59559f2de1&dn=South+Park+20x07+%28720p-HDTV-x264-AVS%29%5BVTV%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (104, 104, 2, u'198.98 MiB', u'South park Season 20 Episode 2', u'ThePirateBay::magnet:?xt=urn:btih:89da24875fd84560a7603baa43e6dc92f6fd4b2a&dn=South+park+Season+20+Episode+2&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (102, 102, 2, u'838.68 MiB', u'South.Park.S20E04.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN', u'ThePirateBay::magnet:?xt=urn:btih:f85c28858b7609c4590294d21ead0330bdd18bb8&dn=South.Park.S20E04.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (100, 50, 9, '6,49 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2016) HDTV [H.264/1080p] (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-7 \xd0\xb8\xd0\xb7 10) Jaskier (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=883108&1058210', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (100, 100, 3, u'840.48 MiB', u'South.Park.S20E05.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN', u'ThePirateBay::magnet:?xt=urn:btih:88c67280085a2f75e4cc0c79968735d33eb901cb&dn=South.Park.S20E05.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (92, 46, 1, '7,91 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2015) WEB-DL [H.264/720p] (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 01-10 \xd0\xb8\xd0\xb7 10)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=798266&940469', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (79, 79, 90, '2.3 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-20-sezon-1-2-seriya-iz-10-south-park-t163180.html?id=833923', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (79, 79, 132, '5.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-20-sezon-1-2-seriya-iz-10-south-park-t163179.html?id=833921', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (55, 55, 100, '6.49 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (1080p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Jaskier)]', 'RiperAM::http://riperam.orghttp://riperam.org/zar-multseriali/ujniy-park-20-sezon-1-8-seriya-iz-10-south-park-t165730.html?id=834562', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (51, 51, 11, '1.56 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477787', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (48, 24, 9, '56,1 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (1997-2014) DVDRip/WebDL (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd0\xbe\xd0\xb2 + \xd1\x81\xd0\xb0\xd0\xbc\xd1\x8b\xd0\xb5 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb2\xd1\x8b\xd0\xb5 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 + \xd0\xbf\xd0\xbe\xd0\xbb\xd0\xbd\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x84\xd0\xb8\xd0\xbb\xd1\x8c\xd0\xbc)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=625124&191859', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (48, 24, 0, '2,57 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South park (2014) HDRip [\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18, 10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb9 \xd0\xb8\xd0\xb7 10] (Paramount comedy)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=734132&852853', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (46, 46, 31, '5.95 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 13 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14 \xd0\xb8\xd0\xb7 14) (\xd0\xa2\xd1\x80\xd0\xb5\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba\xd0\xb5\xd1\x80, \xd0\x9c\xd1\x8d\xd1\x82\xd1\x82 \xd0\xa1\xd1\x82\xd0\xbe\xd1\x83\xd0\xbd) [2009, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, BDRip] \xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xbf\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 (MTV) + \xd0\x9e\xd1\x80\xd0\xb8\xd0\xb3\xd0\xb8\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xb4\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb6\xd0\xba\xd0\xb0 + \xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xbf\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 (V\xd0\xbe-production) + \xd0\x9e\xd1\x80\xd0\xb8\xd0\xb3\xd0\xb8\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xb4\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb6\xd0\xba', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/south-park-c-13-1-14-14-mtv-v-production-t22400.html?id=25896', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (44, 22, 22, '5,01 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2016) (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 20, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-8 \xd0\xb8\xd0\xb7 10) HDTVRip [H.264/720p-LQ] (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=894777&1073915', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (44, 44, 148, '3.36 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Jaskier)]', 'RiperAM::http://riperam.orghttp://riperam.org/zar-multseriali/ujniy-park-20-sezon-1-8-seriya-iz-10-south-park-t165731.html?id=834794', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (42, 21, 1, '2,63 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2015) WEB-DLRip (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 01-10 \xd0\xb8\xd0\xb7 10) [DVO \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=798225&940413', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (39, 39, 34, '4.67 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477518', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (34, 34, 35, '5.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-7 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x94 (Paramount Comedy) / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1479186', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (30, 30, 6, '2 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9, \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-10-seriya-1-iz-10-t111661.html?id=602030', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (27, 27, 6, '9.47 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / 2 x \xd0\x9f\xd0\x94, 2 x \xd0\x9f\xd0\x9c, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1385080', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (26, 13, 1, '4,27 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2015) HDTVRip [H.264/720p-LQ] (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 01-10 \xd0\xb8\xd0\xb7 10) Jaskier', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=815441&964692', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (22, 22, 24, '90.71 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park / 1997-2015 / \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=484607', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (20, 10, 0, '5,62 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (2013) WEB-DL [H.264/720p-LQ] (17 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-10 \xd0\xb8\xd0\xb7 10) (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f) [18+]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=616639&706224', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (19, 19, 0, '2.81 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1377091', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (18, 9, 0, '2,59 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South park (2013) HDRip [\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 17, 10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb9 \xd0\xb8\xd0\xb7 10] (Comedy central)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=728154&845636', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (18, 18, 12, '600 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 7-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8) / South Park / 2016 / \xd0\x9f\xd0\x94 (SunshineStudio) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1492411', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (17, 17, 0, '1.08 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba: \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xb8 \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\x93\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xbd) / South Park: Bigger, Longer & Uncut / 1999 / \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2) / HDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=848584', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (14, 7, 1, '2,96 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) WEB-DLRip (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14) (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=509439&483626', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (14, 14, 3, '2.71 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 15 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14) [2011, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x90\xd0\xbd\xd0\xb8\xd0\xbc\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, WEB-DLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-15-seriya-1-14-t43885.html?id=168699', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (12, 12, 1, '2.61 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6, 8-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x9c (Paramount Comedy), \xd0\xa1\xd0\xa2 / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1378559', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (12, 12, 16, '1.66 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9b\xd0\x9e (L0cDoG) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477158', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (12, 12, 29, '4.72 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (Coldfilm) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1476989', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (11, 11, 0, '2.17 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (17 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2013 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1128747', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (11, 11, 1, '2 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256710', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (10, 5, 0, '19,1 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut (1999) BDRemux [1080p]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=606749&694448', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (10, 10, 0, '6.72 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1377313', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 0, '7.2 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / 2 x \xd0\x9f\xd0\x94, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256573', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 11, '114.84 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (2-18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 14-257 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 257) / South Park / 1998-2014 / \xd0\x9f\xd0\x9c, 5 x \xd0\x9f\xd0\x94, \xd0\x9f\xd0\x9e, \xd0\x90\xd0\x9f, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1121230', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 1, '6.08 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256771', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 3, '7.91 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / 2 x \xd0\x9f\xd0\x94, 2 x \xd0\x9f\xd0\x9c, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1384013', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 0, '8.18 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut / 1999 / \xd0\x9f\xd0\x9c, 3 x \xd0\x90\xd0\x9f, \xd0\xa1\xd0\xa2 / BDRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1198585', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 0, '412 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9b\xd0\x9e (L0cDoG) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1476939', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 4, 0, '2,38 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 2 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 2 season (1998) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=9947&10798', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (8, 4, 0, '2,57 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 3 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 3 season (1999) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=10082&10944', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (8, 4, 0, '7,48 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (15 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14) (2011) [H.264/720p-LQ] WEB-DL', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=525722&594572', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (8, 8, 7, '48.9 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-11 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park / 1997-2007 / \xd0\x9f\xd0\x9c / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=368930', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 8, 4, '6.92 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba (1-2 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park / 1997-1998 / \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2) / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=672637', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 8, 15, '2.3 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (IdeaFilm) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477174', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 8, 2, '8.28 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1377153', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (7, 7, 0, '4.61 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 19, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8: 1-6, 8 \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DL (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Paramount Comedy)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-sezon-19-serii-1-6-8-iz-10-south-park-t137916.html?id=721091', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (7, 7, 45, '5.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (IdeaFilm) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477176', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (7, 7, 0, '1.37 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba: \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xb8 \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger, Longer & Uncut / 1999 / \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2) / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=371714', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (6, 3, 0, '2,03 GB', 'South Park /\xd0\xa1\xd0\xb0\xd1\x83\xd1\x82-\xd0\x9f\xd0\xb0\xd1\x80\xd0\xba 9 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd MTV', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=5373&6079', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 0, '694 MB', '\xd0\xa1\xd0\xb0\xd1\x83\xd1\x82 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut (1999) DVDrip (\xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 \xd0\x93\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xb0)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=5835&6569', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 0, '87,6 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba \xd0\x9a\xd0\xbe\xd0\xbb\xd0\xbb\xd0\xb5\xd0\xba\xd1\x86\xd0\xb8\xd1\x8f / South Park Collection (1997-2010) DVDRip, BDRip, WebDL (1-13 \xd0\xb8 14 (1-7 \xd1\x8d\xd0\xbf.) c\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=245759&260814', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 0, '2,71 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 15 \xd0\xbf\xd0\xbe\xd0\xbb\xd0\xbd\xd1\x8b\xd0\xb9 (14)) (2011) HDTVRip (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=303178&330978', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 1, '7,39 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5 WEB-DLRip (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 (14)) [720p]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=510810&486782', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 6, 3, '2.53 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-9 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9)=\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5=]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-4-seriya-iz-10-south-park-t139331.html?id=724547', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (6, 6, 23, '4.31 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-7 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / 3 x \xd0\x9f\xd0\x9c, 2 x \xd0\x9f\xd0\x94, 2 x \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477387', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (6, 6, 4, '560 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 7-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8) / South Park / 2016 / \xd0\x9f\xd0\x94 (SunshineStudio) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1492410', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 0, '2.76 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9f\xd0\x94 (Paramount Comedy) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1274229', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 6, '4.92 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (Jaskier), \xd0\xa1\xd0\xa2 / HDTVRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477358', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 15, '1.19 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8) / South Park / 2016 / \xd0\x9f\xd0\x9c (Coldfilm) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1476986', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 4, '2.54 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (Jaskier), \xd0\xa1\xd0\xa2 / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477462', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 9, '61.48 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b: 1-273 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 277) / South Park / 1997-2016 / \xd0\x9f\xd0\x9c (Paramount Comedy ex MTV) / HEVC / WEB-DLRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1482039', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 2, 0, '2,51 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 8 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 8 season (2004) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=9410&10281', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '2,82 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 4 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 4 season (2000) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=10086&10948', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '4,3 GB', 'South Park: Bigger Longer & Uncut / \xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbf\xd0\xbe\xd0\xbb\xd0\xbd\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd1\x84\xd0\xb8\xd0\xbb\xd1\x8c\xd0\xbc, \xd0\x93\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xbd) DVD-5', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=42538&43366', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '44,2 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\x92\xd1\x81\xd0\xb5 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=62239&63500', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '3,57 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut (1999) [720p] BDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=150728&152983', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '7,32 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14) / South Park (2012) WEB-DLRip [H.264/720p-LQ]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=510462&558155', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '8,23 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) WEB-DL [H.264/720p-LQ] (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=532312&594562', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '11,9 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) WEB-DLRip [H.264/1080p-LQ] (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16 / \xd0\xad\xd0\xbf\xd0\xb8\xd0\xb7\xd0\xbe\xd0\xb4 1-14 \xd0\xb8\xd0\xb7 14)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=528308&597806', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 4, 0, '3.43 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (17 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb9 \xd0\xb8\xd0\xb7 10) / South Park / 2013 / \xd0\x9f\xd0\x94 (Paramount Comedy) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1155833', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '2.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\xba\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1024129', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '11.86 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / 2 x \xd0\x9f\xd0\x94, \xd0\x9f\xd0\x9c, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1050214', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '2.68 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / \xd0\x9f\xd0\x94 (Paramount Comedy) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1050218', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '4.1 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9b\xd0\x9e (L0cDoG) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1380757', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 7, '2.31 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 19, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8: 1-6, 8-9 \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Paramount Comedy)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-sezon-19-serii-1-6-8-9-iz-10-south-park-t137915.html?id=726250', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (3, 3, 1, '2.27 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9b\xd1\x8e\xd0\xb1\xd0\xb8\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9) - L0cDoG]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-18-seriya-1-t111466.html?id=599823', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (3, 3, 0, '7.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\xba\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1030433', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 9, '174.76 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (3-18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 32-257 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 257) / South Park / 1999-2014 / \xd0\x9f\xd0\x9c, 4 x \xd0\x9f\xd0\x94, \xd0\x9f\xd0\x9e, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1132433', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 0, '2.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9b\xd0\x9e, \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256768', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 2, '28.6 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-2 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-31 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 31) / South Park / 1997-1998 / 3 x \xd0\x9f\xd0\x94, \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2), \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1330595', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 0, '2.85 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9b\xd0\x9e (L0cDoG), \xd0\xa1\xd0\xa2 / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1376594', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 1, 0, '2,32 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba \xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 10 / South Park Season 10 MTV!(2006)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=33856&34674', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '3,42 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: 11 \xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd.(MTV) / South Park 11 Season Complete (2007) [SAT-Rip]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=76759&77067', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '700 MB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba \xd0\x92\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbb\xd1\x8f\xd0\xbd\xd0\xb4\xd0\xb8\xd1\x8f / South Park Imaginationland (2008) DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=114379&115419', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '8,81 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (1997-2008 \xd0\xb3\xd0\xb3.) 11 \xd0\xa1\xd0\x95\xd0\x97\xd0\x9e\xd0\x9d\xd0\x9e\xd0\x92 [DVDRip]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=119670&120391', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 1, '714 MB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba 12 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd / South Park 12 season (2008) DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=133111&133059', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '918 MB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba 13 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd / South Park 13 season (2009)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=131974&133062', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '41 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba 13 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd0\xbe\xd0\xb2 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 MTV + \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\x94\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xb8 \xd0\x9d\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 + \xd0\x92\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbb\xd1\x8f\xd0\xbd\xd0\xb4\xd0\xb8\xd1\x8f (1992-2009) + \xd0\xbc\xd1\x83\xd0\xb7\xd1\x8b\xd0\xba\xd0\xb0 / South Park (1992-2009) DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=180268&185413', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 2, 0, '1.45 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x92\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbb\xd1\x8f\xd0\xbd\xd0\xb4\xd0\xb8\xd1\x8f / South Park: Imaginationland / 2008 / \xd0\x9f\xd0\x9c / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=547097', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 2, 1, '16.54 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (15 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2011 / \xd0\x9f\xd0\x9c, 2 x \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / BDRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=999727', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 2, 0, '5.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (15 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2011 / 2 x \xd0\x9f\xd0\x9c, \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / HDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1000191', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 2, 0, '14.49 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (14 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2010 / \xd0\x9f\xd0\x9c, 2 x \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / BDRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1127883', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (0, 0, 0, '33.24 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 01-19 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-266) [1997-2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, BDRip1080p, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - MTV]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-01-19-seriya-1-266-t163989.html?id=818401', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '349.73 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 19, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f: 7) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Paramount Comedy)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-sezon-19-seriya-7-south-park-t143571.html?id=726424', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 1, '3.78 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DL (720p), \xd0\x9b\xd1\x8e\xd0\xb1\xd0\xb8\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9) - L0cDoG]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-18-seriya-1-t111655.html?id=600621', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '5.35 \xd0\x93\xd0\x91', '[PC] South Park: The Stick of Truth + 1 DLC / South Park: \xd0\x9f\xd0\xb0\xd0\xbb\xd0\xba\xd0\xb0 \xd0\x98\xd1\x81\xd1\x82\xd0\xb8\xd0\xbd\xd1\x8b [RPG] [\xd0\x9b\xd0\xb8\xd1\x86\xd0\xb5\xd0\xbd\xd0\xb7\xd0\xb8\xd1\x8f] [\xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb0\xd0\xbd\xd0\xb3\xd0\xbb\xd0\xb8\xd0\xb9\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd1\x84\xd1\x80\xd0\xb0\xd0\xbd\xd1\x86\xd1\x83\xd0\xb7\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb8\xd1\x82\xd0\xb0\xd0\xbb\xd1\x8c\xd1\x8f\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbc\xd0\xb5\xd1\x86\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb8\xd1\x81\xd0\xbf\xd0\xb0\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb1\xd1\x80\xd0\xb0\xd0\xb7\xd0\xb8\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xbf\xd0\xbe\xd1\x80\xd1\x82\xd1\x83\xd0\xb3\xd0\xb0\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 / ENG] (2014)', 'RiperAM::http://riperam.orghttp://riperam.org/hot-games/south-park-the-stick-of-truth-1-dlc-south-park-palka-istini-2014-t98200.html?id=475637', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '3.9 \xd0\x93\xd0\x91', '[PC] South Park: The Stick of Truth + 1 DLC / South Park: \xd0\x9f\xd0\xb0\xd0\xbb\xd0\xba\xd0\xb0 \xd0\x98\xd1\x81\xd1\x82\xd0\xb8\xd0\xbd\xd1\x8b [RPG] [RePack \xd0\xbe\xd1\x82 R.G. Element Arts] [\xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb0\xd0\xbd\xd0\xb3\xd0\xbb\xd0\xb8\xd0\xb9\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 / ENG] (2014)', 'RiperAM::http://riperam.orghttp://riperam.org/hot-repack-games/south-park-the-stick-of-truth-1-dlc-south-park-palka-istini-2014-t98201.html?id=475645', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '2.17 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 17 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f: 1-10 \xd0\xb8\xd0\xb7 10) [2013, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-17-seriya-1-iz-10-t86496.html?id=473330', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '3.43 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 17 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8: 1-10 \xd0\xb8\xd0\xb7 10) [2013, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-17-seriya-1-iz-10-t86160.html?id=448987', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '2.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14 \xd0\xb8\xd0\xb7 14) [2012, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEBDLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-16-seriya-1-8-iz-14-t56766.html?id=266561', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '38.16 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 1-10 \xd0\xb8\xd0\xb7 16 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-153 \xd0\xb8\xd0\xb7 153) [1997-2007, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, DVDRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-1-10-iz-16-seriya-1-153-iz-153-t56116.html?id=236508', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '2.83 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 14 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14 \xd0\xb8\xd0\xb7 14) (\xd0\xa2\xd1\x80\xd0\xb5\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba\xd0\xb5\xd1\x80, \xd0\x9c\xd1\x8d\xd1\x82\xd1\x82 \xd0\xa1\xd1\x82\xd0\xbe\xd1\x83\xd0\xbd) [2011, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip] \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9, \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) VO-Production', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/south-park-c-14-1-14-14-vo-production-t22103.html?id=25606', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png')] + dialog = MultiChoiceDialog("Select items", items) + dialog.doModal() + del dialog #You need to delete your instance when it is no longer needed + #because underlying xbmcgui classes are not grabage-collected. \ No newline at end of file From 8dfc464e1b6ed71818140055334b5e1ffdeeaedb Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sat, 26 Nov 2016 13:14:33 +0300 Subject: [PATCH 025/126] windows progress --- Core.py | 7 +++++ searchwindow.py | 72 ++++++++++++++++++++++++++++++++++--------------- 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/Core.py b/Core.py index 487c7bc..f9a16dd 100644 --- a/Core.py +++ b/Core.py @@ -83,6 +83,9 @@ class Core: DLScontextMenu.append( (self.localize('Clear %s') % self.localize('Download Status'), ListString % ('DownloadStatus', 'clear', 'addtime', ''))) DLScontextMenu.extend(contextMenu) + if self.debug: + self.drawItem('< %s >' % self.localize('Search Window'), 'searchWindow', + image=self.ROOT + '/icons/settings.png', isFolder=False) self.drawItem('< %s >' % self.localize('Download Status'), 'DownloadStatus', image=self.ROOT + '/icons/download.png', contextMenu=DLScontextMenu, replaceMenu=False) self.drawItem('< %s >' % self.localize('Torrent-client Browser'), 'uTorrentBrowser', @@ -1599,6 +1602,10 @@ class Core: xbmc.executebuiltin( 'xbmc.RunScript(%s,)' % os.path.join(ROOT, 'controlcenter.py')) + def searchWindow(self, params={}): + xbmc.executebuiltin( + 'xbmc.RunScript(%s,)' % os.path.join(ROOT, 'searchwindow.py')) + def showFilesList(self, filesList, params={}): get = params.get thumbnail = unquote(get("thumbnail"),'') diff --git a/searchwindow.py b/searchwindow.py index f879349..d302c5f 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -17,17 +17,22 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . ''' -import os +import sys, os + +import xbmcaddon import xbmc import xbmcgui -import xbmcaddon +from functions import getParameters, HistoryDB, Searchers, log import pyxbmct.addonwindow as pyxbmct +import Localization -_addon = xbmcaddon.Addon() -_path = _addon.getAddonInfo("path") __settings__ = xbmcaddon.Addon(id='plugin.video.torrenter') +__language__ = __settings__.getLocalizedString __version__ = __settings__.getAddonInfo('version') __plugin__ = __settings__.getAddonInfo('name') + " v." + __version__ +__root__ = __settings__.getAddonInfo('path') + +log('SYS ARGV: ' + str(sys.argv)) class MultiChoiceDialog(pyxbmct.AddonDialogWindow): @@ -41,16 +46,21 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): self.items() self.set_navigation() + def icon(self, icon): + return '%s/icons/%s.png' %(__root__, icon) + def set_controls(self): self.input_search = pyxbmct.Edit("Search"+"...") self.placeControl(self.input_search, 0, 0, 1, 5) self.button_search = pyxbmct.Button("Search") - self.placeControl(self.button_search, 0, 5, 1, 1) - self.button_keyboard = pyxbmct.Button("keyboard") - self.placeControl(self.button_keyboard, 0, 6, 1, 1) + self.placeControl(self.button_search, 0, 5, 1, 2) + self.button_history = pyxbmct.Button("History") + self.placeControl(self.button_history, 0, 7, 1, 2) + self.button_open = pyxbmct.Button("Open") + self.placeControl(self.button_open, 1, 14, 1, 2) self.listing = pyxbmct.List(_imageWidth=40, _imageHeight=40, _itemTextXOffset=10, _itemTextYOffset=2, _itemHeight=40, _space=2, _alignmentY=4) - self.placeControl(self.listing, 1, 0, 8, 15) + self.placeControl(self.listing, 1, 0, 8, 14) def connect_controls(self): @@ -59,27 +69,47 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): #self.connect(self.cancel_button, self.close) def set_navigation(self): - self.listing.controlUp(self.input_search) - self.listing.controlDown(self.input_search) - self.input_search.setNavigation(self.listing, self.listing, self.button_keyboard, self.button_search) - self.button_search.setNavigation(self.listing, self.listing, self.input_search, self.button_keyboard) - self.button_keyboard.setNavigation(self.listing, self.listing, self.button_search, self.input_search) + #Top menu + self.input_search.setNavigation(self.listing, self.listing, self.button_history, self.button_search) + self.button_search.setNavigation(self.listing, self.listing, self.input_search, self.button_history) + self.button_history.setNavigation(self.listing, self.listing, self.button_search, self.input_search) + #Listing + self.listing.setNavigation(self.input_search, self.input_search, self.input_search, self.button_open) + #Right menu + self.button_open.setNavigation(self.button_history, self.listing, self.listing, self.input_search) + if self.listing.size(): self.setFocus(self.listing) else: self.setFocus(self.input_search) + def setAnimation(self, control): + # Set fade animation for all add-on window controls + control.setAnimations([('WindowOpen', 'effect=fade start=0 end=100 time=500',), + ('WindowClose', 'effect=fade start=100 end=0 time=500',)]) + def items(self): self.listing.reset() for (order, seeds, leechers, size, title, link, image) in self.filesList: title = titleMake(seeds, leechers, size, title) - log(title) - list_item = xbmcgui.ListItem(title, "", image, '', '') - self.listing.addItem(list_item) + #log(title) + listitem = xbmcgui.ListItem(title, "", image, '', '') + contextMenu = [(self.localize('Search Control Window'), + 'xbmc.RunScript(%s,)' % os.path.join(__root__, 'controlcenter.py'))] + replaceMenu = True + listitem.addContextMenuItems(contextMenu, replaceItems=replaceMenu) + self.listing.addItem(listitem) def press(self): - self.filesList = sorted(self.filesList, key=lambda x: x[4], reverse=True) - self.items() + #self.filesList = sorted(self.filesList, key=lambda x: x[1], reverse=True) + #self.items() + log(self.listing.getSelectedItem().getLabel()) + + def localize(self, string): + try: + return Localization.localize(string) + except: + return string def log(msg): try: @@ -94,15 +124,15 @@ def titleMake(seeds, leechers, size, title): #AARRGGBB clGreen = '[COLOR FF008000]%s[/COLOR]' clDodgerblue = '[COLOR FF1E90FF]%s[/COLOR]' - clDimgray = '[COLOR FF696969]%s[/COLOR]' + clDimgray = '[COLOR FF999999]%s[/COLOR]' clWhite = '[COLOR FFFFFFFF]%s[/COLOR]' clAliceblue = '[COLOR FFF0F8FF]%s[/COLOR]' clRed = '[COLOR FFFF0000]%s[/COLOR]' title = title.replace('720p', '[B]720p[/B]').replace('1080p', '[B]1080p[/B]') title = clWhite % title - second = '\r\n[I](%s) [S/L: %d/%d] [/I]' % (size, seeds, leechers) - title += ' ' + second + second = '[I](%s) [S/L: %d/%d] [/I]' % (size, seeds, leechers) + title += '\r\n' + clDimgray % second return title if __name__ == "__main__": From 317f64c2f8f0222ce1f94b717af0ac6c1a40c8ed Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sat, 26 Nov 2016 19:05:04 +0300 Subject: [PATCH 026/126] search added --- searchwindow.py | 108 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 83 insertions(+), 25 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index d302c5f..77b0b17 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -17,12 +17,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . ''' -import sys, os +import sys, os, urllib import xbmcaddon import xbmc import xbmcgui -from functions import getParameters, HistoryDB, Searchers, log +from functions import search, HistoryDB, Searchers, log import pyxbmct.addonwindow as pyxbmct import Localization @@ -36,28 +36,30 @@ log('SYS ARGV: ' + str(sys.argv)) class MultiChoiceDialog(pyxbmct.AddonDialogWindow): - def __init__(self, title="", filesList=None): + __settings__ = sys.modules["__main__"].__settings__ + fileList = [] + + def __init__(self, title=""): super(MultiChoiceDialog, self).__init__(title) self.setGeometry(1280, 720, 9, 16) self.selected = [] self.set_controls() self.connect_controls() - self.filesList = filesList - self.items() self.set_navigation() def icon(self, icon): return '%s/icons/%s.png' %(__root__, icon) def set_controls(self): - self.input_search = pyxbmct.Edit("Search"+"...") + self.input_search = pyxbmct.Edit("") self.placeControl(self.input_search, 0, 0, 1, 5) self.button_search = pyxbmct.Button("Search") self.placeControl(self.button_search, 0, 5, 1, 2) self.button_history = pyxbmct.Button("History") self.placeControl(self.button_history, 0, 7, 1, 2) - self.button_open = pyxbmct.Button("Open") - self.placeControl(self.button_open, 1, 14, 1, 2) + self.button_right1 = pyxbmct.Button("Open") + self.placeControl(self.button_right1, 1, 14, 1, 2) + self.right_menu() self.listing = pyxbmct.List(_imageWidth=40, _imageHeight=40, _itemTextXOffset=10, _itemTextYOffset=2, _itemHeight=40, _space=2, _alignmentY=4) self.placeControl(self.listing, 1, 0, 8, 14) @@ -65,8 +67,8 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): def connect_controls(self): self.connect(self.listing, self.press) - #self.connect(self.ok_button, self.ok) - #self.connect(self.cancel_button, self.close) + self.connect(self.button_history, self.history) + self.connect(self.button_search, self.search) def set_navigation(self): #Top menu @@ -74,9 +76,9 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): self.button_search.setNavigation(self.listing, self.listing, self.input_search, self.button_history) self.button_history.setNavigation(self.listing, self.listing, self.button_search, self.input_search) #Listing - self.listing.setNavigation(self.input_search, self.input_search, self.input_search, self.button_open) + self.listing.setNavigation(self.input_search, self.input_search, self.input_search, self.button_right1) #Right menu - self.button_open.setNavigation(self.button_history, self.listing, self.listing, self.input_search) + self.button_right1.setNavigation(self.button_history, self.listing, self.listing, self.input_search) if self.listing.size(): self.setFocus(self.listing) @@ -88,22 +90,74 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): control.setAnimations([('WindowOpen', 'effect=fade start=0 end=100 time=500',), ('WindowClose', 'effect=fade start=100 end=0 time=500',)]) - def items(self): + def search(self, addtime=None): self.listing.reset() - for (order, seeds, leechers, size, title, link, image) in self.filesList: - title = titleMake(seeds, leechers, size, title) - #log(title) - listitem = xbmcgui.ListItem(title, "", image, '', '') - contextMenu = [(self.localize('Search Control Window'), - 'xbmc.RunScript(%s,)' % os.path.join(__root__, 'controlcenter.py'))] - replaceMenu = True - listitem.addContextMenuItems(contextMenu, replaceItems=replaceMenu) - self.listing.addItem(listitem) + query = self.input_search.getText() + log('Search query: '+str(query)) + + if len(query)>0: + self.filesList = self.get_filesList(query, addtime) + else: + self.filesList = [(1919, 1919, 52, u'102.66 MiB', u'South.Park.S20E06.HDTV.x264-FUM[ettv]', + u'ThePirateBay::magnet:?xt=urn:btih:0792ea51bc16a19893871197fa927ecec7ca25aa&dn=South.Park.S20E06.HDTV.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', + 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png')] + if 1==1: + for (order, seeds, leechers, size, title, link, image) in self.filesList: + title = titleMake(seeds, leechers, size, title) + #log(title) + listitem = xbmcgui.ListItem(title, "", image, '', '') + listitem.setInfo(type='Video', infoLabels={}) + contextMenu = [(self.localize('Search Control Window'), + 'xbmc.RunScript(%s,)' % os.path.join(__root__, 'controlcenter.py'))] + replaceMenu = False + listitem.addContextMenuItems(contextMenu, replaceItems=replaceMenu) + self.listing.addItem(listitem) + + def get_filesList(self, query, addtime = None): + if self.__settings__.getSetting('history')=='true': + HistoryDB().add(query) + searchersList = [] + if addtime: + providers=HistoryDB().get_providers(addtime) + if providers: + for searcher in providers: + searchersList.append(searcher) + if not addtime or not searchersList: + searchersList = Searchers().get_active() + + filesList=search(query, searchersList) + if self.__settings__.getSetting('sort_search')=='true': + self.__settings__.setSetting('sort_search','1') + if int(self.__settings__.getSetting('sort_search'))==0: + filesList = sorted(filesList, key=lambda x: x[0], reverse=True) + elif int(self.__settings__.getSetting('sort_search'))==2: + filesList = sorted(filesList, key=lambda x: x[4], reverse=False) + + log('get_filesList filesList: '+str(filesList)) + + return filesList def press(self): #self.filesList = sorted(self.filesList, key=lambda x: x[1], reverse=True) #self.items() log(self.listing.getSelectedItem().getLabel()) + xbmcgui.Dialog().ok('yyy', 'yyy') + + def history(self): + self.right_menu('history') + + def history_search(self): + xbmcgui.Dialog().ok('xxx','xxx') + log('history_search: '+self.listing.getSelectedItem().getLabel()) + + def right_menu(self, mode='search'): + if mode == 'search': + self.button_right1.setLabel("Open") + self.connect(self.button_right1, self.press) + elif mode == 'history': + self.button_right1.setLabel("Search") + self.connect(self.button_right1, self.history_search) + self.connect(self.button_right1, self.history_search) def localize(self, string): try: @@ -136,8 +190,12 @@ def titleMake(seeds, leechers, size, title): return title if __name__ == "__main__": - items = [(1919, 1919, 52, u'102.66 MiB', u'South.Park.S20E06.HDTV.x264-FUM[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:0792ea51bc16a19893871197fa927ecec7ca25aa&dn=South.Park.S20E06.HDTV.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (1545, 1545, 31, u'97.26 MiB', u'South.Park.S20E05.HDTV.x264-KILLERS[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:437487c32ce82f050cdbfccfc04e4e20aca0d4cb&dn=South.Park.S20E05.HDTV.x264-KILLERS%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (1265, 1265, 75, u'89.69 MiB', u'South.Park.S20E07.HDTV.x264-FLEET', u'ThePirateBay::magnet:?xt=urn:btih:a122b0b79c4cbacea959e6e032ab540674ce49eb&dn=South.Park.S20E07.HDTV.x264-FLEET&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (1083, 1083, 9, u'99.5 MiB', u'South.Park.S20E03.PROPER.HDTV.x264-KILLERS[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:ed2806f33629ec637caeabcc25ae1e70d5971ebe&dn=South.Park.S20E03.PROPER.HDTV.x264-KILLERS%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (429, 429, 19, u'85.08 MiB', u'South.Park.S20E08.WEBRip.x264-FUM[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:988728720702c55fd1d19cde10f9af720ed934eb&dn=South.Park.S20E08.WEBRip.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (311, 311, 229, u'251.67 MiB', u'South.Park.S20E08.1080p.HDTV.x264[state]', u'ThePirateBay::magnet:?xt=urn:btih:a5fa25dfccfa43723e34466b47fed2f89dd34072&dn=South.Park.S20E08.1080p.HDTV.x264%5Bstate%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (272, 272, 51, '6.08 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DL (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9, \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-10-seriya-1-iz-10-t111662.html?id=602710', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (237, 237, 6, u'367.96 MiB', u'South.Park.S20E03.720p.HDTV.x264-AVS[rarbg]', u'ThePirateBay::magnet:?xt=urn:btih:a6fd5218db8b5445981ce1466a501ae1e72fc538&dn=South.Park.S20E03.720p.HDTV.x264-AVS%5Brarbg%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (206, 206, 127, '4.1 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) (L0cDoG)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-8-seriya-iz-10-south-park-t141746.html?id=725943', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (168, 168, 3, u'184.19 MiB', u'South.Park.S20E08.Members.Only.720p.WEBRip.AAC2.0.H.264.mkv', u'ThePirateBay::magnet:?xt=urn:btih:0647e29a5a9b96f91f97f73bb010e8eb9aca66b7&dn=South.Park.S20E08.Members.Only.720p.WEBRip.AAC2.0.H.264.mkv&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (154, 154, 62, '6.51 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-5-seriya-iz-10-south-park-t137088.html?id=727333', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (154, 154, 87, '3.33 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) (L0cDoG)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-8-seriya-iz-10-south-park-t141747.html?id=725945', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (140, 140, 5, u'81.54 MiB', u'South Park S20E08 720p Uncensored Web-DL EN-Sub x264-[MULVAcoded', u'ThePirateBay::magnet:?xt=urn:btih:2491997192df91dd3581db848f0c998d90b1ea09&dn=South+Park+S20E08+720p+Uncensored+Web-DL+EN-Sub+x264-%5BMULVAcoded&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (135, 135, 44, '2.13 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-5-seriya-iz-10-south-park-t137089.html?id=727335', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (118, 118, 12, u'1.38 GiB', u'South.Park.Season.17.Complete.UNCENSORED.720p.WEB-DL.x264.AAC', u'ThePirateBay::magnet:?xt=urn:btih:e92aa604285e189749bb2ce7d5e90e2dca726192&dn=South.Park.Season.17.Complete.UNCENSORED.720p.WEB-DL.x264.AAC&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (116, 116, 2, u'843.03 MiB', u'South.Park.S20E06.Fort.Collins.UNCENSORED.1080p.WEB-DL.H.264-YFN', u'ThePirateBay::magnet:?xt=urn:btih:1c4f30359538f253efc5a292101abb8520406131&dn=South.Park.S20E06.Fort.Collins.UNCENSORED.1080p.WEB-DL.H.264-YFN&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (113, 113, 226, '90.71 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 1-19 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-267 \xd0\xb8\xd0\xb7 267) [1997-2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEBDLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - "Paramount Comedy" ex-MTV]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-18-seriya-1-iz-10-t112158.html?id=771968', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (112, 56, 22, '2,21 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2016) HDTVRip (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-8 \xd0\xb8\xd0\xb7 10) L0cDoG (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=887776&1064662', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (109, 109, 2, u'348.34 MiB', u'South Park 20x07 (720p-HDTV-x264-AVS)[VTV]', u'ThePirateBay::magnet:?xt=urn:btih:06cae396d7276a2e81fe4bd9ca251d59559f2de1&dn=South+Park+20x07+%28720p-HDTV-x264-AVS%29%5BVTV%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (104, 104, 2, u'198.98 MiB', u'South park Season 20 Episode 2', u'ThePirateBay::magnet:?xt=urn:btih:89da24875fd84560a7603baa43e6dc92f6fd4b2a&dn=South+park+Season+20+Episode+2&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (102, 102, 2, u'838.68 MiB', u'South.Park.S20E04.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN', u'ThePirateBay::magnet:?xt=urn:btih:f85c28858b7609c4590294d21ead0330bdd18bb8&dn=South.Park.S20E04.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (100, 50, 9, '6,49 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2016) HDTV [H.264/1080p] (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-7 \xd0\xb8\xd0\xb7 10) Jaskier (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=883108&1058210', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (100, 100, 3, u'840.48 MiB', u'South.Park.S20E05.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN', u'ThePirateBay::magnet:?xt=urn:btih:88c67280085a2f75e4cc0c79968735d33eb901cb&dn=South.Park.S20E05.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (92, 46, 1, '7,91 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2015) WEB-DL [H.264/720p] (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 01-10 \xd0\xb8\xd0\xb7 10)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=798266&940469', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (79, 79, 90, '2.3 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-20-sezon-1-2-seriya-iz-10-south-park-t163180.html?id=833923', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (79, 79, 132, '5.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-20-sezon-1-2-seriya-iz-10-south-park-t163179.html?id=833921', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (55, 55, 100, '6.49 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (1080p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Jaskier)]', 'RiperAM::http://riperam.orghttp://riperam.org/zar-multseriali/ujniy-park-20-sezon-1-8-seriya-iz-10-south-park-t165730.html?id=834562', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (51, 51, 11, '1.56 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477787', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (48, 24, 9, '56,1 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (1997-2014) DVDRip/WebDL (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd0\xbe\xd0\xb2 + \xd1\x81\xd0\xb0\xd0\xbc\xd1\x8b\xd0\xb5 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb2\xd1\x8b\xd0\xb5 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 + \xd0\xbf\xd0\xbe\xd0\xbb\xd0\xbd\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x84\xd0\xb8\xd0\xbb\xd1\x8c\xd0\xbc)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=625124&191859', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (48, 24, 0, '2,57 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South park (2014) HDRip [\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18, 10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb9 \xd0\xb8\xd0\xb7 10] (Paramount comedy)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=734132&852853', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (46, 46, 31, '5.95 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 13 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14 \xd0\xb8\xd0\xb7 14) (\xd0\xa2\xd1\x80\xd0\xb5\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba\xd0\xb5\xd1\x80, \xd0\x9c\xd1\x8d\xd1\x82\xd1\x82 \xd0\xa1\xd1\x82\xd0\xbe\xd1\x83\xd0\xbd) [2009, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, BDRip] \xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xbf\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 (MTV) + \xd0\x9e\xd1\x80\xd0\xb8\xd0\xb3\xd0\xb8\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xb4\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb6\xd0\xba\xd0\xb0 + \xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xbf\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 (V\xd0\xbe-production) + \xd0\x9e\xd1\x80\xd0\xb8\xd0\xb3\xd0\xb8\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xb4\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb6\xd0\xba', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/south-park-c-13-1-14-14-mtv-v-production-t22400.html?id=25896', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (44, 22, 22, '5,01 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2016) (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 20, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-8 \xd0\xb8\xd0\xb7 10) HDTVRip [H.264/720p-LQ] (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=894777&1073915', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (44, 44, 148, '3.36 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Jaskier)]', 'RiperAM::http://riperam.orghttp://riperam.org/zar-multseriali/ujniy-park-20-sezon-1-8-seriya-iz-10-south-park-t165731.html?id=834794', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (42, 21, 1, '2,63 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2015) WEB-DLRip (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 01-10 \xd0\xb8\xd0\xb7 10) [DVO \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=798225&940413', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (39, 39, 34, '4.67 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477518', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (34, 34, 35, '5.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-7 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x94 (Paramount Comedy) / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1479186', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (30, 30, 6, '2 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9, \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-10-seriya-1-iz-10-t111661.html?id=602030', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (27, 27, 6, '9.47 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / 2 x \xd0\x9f\xd0\x94, 2 x \xd0\x9f\xd0\x9c, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1385080', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (26, 13, 1, '4,27 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2015) HDTVRip [H.264/720p-LQ] (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 01-10 \xd0\xb8\xd0\xb7 10) Jaskier', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=815441&964692', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (22, 22, 24, '90.71 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park / 1997-2015 / \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=484607', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (20, 10, 0, '5,62 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (2013) WEB-DL [H.264/720p-LQ] (17 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-10 \xd0\xb8\xd0\xb7 10) (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f) [18+]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=616639&706224', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (19, 19, 0, '2.81 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1377091', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (18, 9, 0, '2,59 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South park (2013) HDRip [\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 17, 10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb9 \xd0\xb8\xd0\xb7 10] (Comedy central)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=728154&845636', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (18, 18, 12, '600 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 7-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8) / South Park / 2016 / \xd0\x9f\xd0\x94 (SunshineStudio) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1492411', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (17, 17, 0, '1.08 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba: \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xb8 \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\x93\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xbd) / South Park: Bigger, Longer & Uncut / 1999 / \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2) / HDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=848584', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (14, 7, 1, '2,96 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) WEB-DLRip (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14) (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=509439&483626', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (14, 14, 3, '2.71 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 15 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14) [2011, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x90\xd0\xbd\xd0\xb8\xd0\xbc\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, WEB-DLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-15-seriya-1-14-t43885.html?id=168699', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (12, 12, 1, '2.61 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6, 8-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x9c (Paramount Comedy), \xd0\xa1\xd0\xa2 / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1378559', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (12, 12, 16, '1.66 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9b\xd0\x9e (L0cDoG) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477158', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (12, 12, 29, '4.72 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (Coldfilm) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1476989', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (11, 11, 0, '2.17 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (17 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2013 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1128747', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (11, 11, 1, '2 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256710', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (10, 5, 0, '19,1 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut (1999) BDRemux [1080p]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=606749&694448', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (10, 10, 0, '6.72 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1377313', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 0, '7.2 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / 2 x \xd0\x9f\xd0\x94, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256573', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 11, '114.84 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (2-18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 14-257 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 257) / South Park / 1998-2014 / \xd0\x9f\xd0\x9c, 5 x \xd0\x9f\xd0\x94, \xd0\x9f\xd0\x9e, \xd0\x90\xd0\x9f, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1121230', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 1, '6.08 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256771', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 3, '7.91 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / 2 x \xd0\x9f\xd0\x94, 2 x \xd0\x9f\xd0\x9c, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1384013', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 0, '8.18 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut / 1999 / \xd0\x9f\xd0\x9c, 3 x \xd0\x90\xd0\x9f, \xd0\xa1\xd0\xa2 / BDRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1198585', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 0, '412 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9b\xd0\x9e (L0cDoG) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1476939', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 4, 0, '2,38 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 2 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 2 season (1998) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=9947&10798', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (8, 4, 0, '2,57 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 3 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 3 season (1999) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=10082&10944', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (8, 4, 0, '7,48 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (15 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14) (2011) [H.264/720p-LQ] WEB-DL', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=525722&594572', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (8, 8, 7, '48.9 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-11 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park / 1997-2007 / \xd0\x9f\xd0\x9c / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=368930', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 8, 4, '6.92 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba (1-2 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park / 1997-1998 / \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2) / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=672637', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 8, 15, '2.3 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (IdeaFilm) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477174', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 8, 2, '8.28 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1377153', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (7, 7, 0, '4.61 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 19, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8: 1-6, 8 \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DL (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Paramount Comedy)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-sezon-19-serii-1-6-8-iz-10-south-park-t137916.html?id=721091', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (7, 7, 45, '5.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (IdeaFilm) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477176', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (7, 7, 0, '1.37 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba: \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xb8 \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger, Longer & Uncut / 1999 / \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2) / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=371714', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (6, 3, 0, '2,03 GB', 'South Park /\xd0\xa1\xd0\xb0\xd1\x83\xd1\x82-\xd0\x9f\xd0\xb0\xd1\x80\xd0\xba 9 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd MTV', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=5373&6079', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 0, '694 MB', '\xd0\xa1\xd0\xb0\xd1\x83\xd1\x82 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut (1999) DVDrip (\xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 \xd0\x93\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xb0)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=5835&6569', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 0, '87,6 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba \xd0\x9a\xd0\xbe\xd0\xbb\xd0\xbb\xd0\xb5\xd0\xba\xd1\x86\xd0\xb8\xd1\x8f / South Park Collection (1997-2010) DVDRip, BDRip, WebDL (1-13 \xd0\xb8 14 (1-7 \xd1\x8d\xd0\xbf.) c\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=245759&260814', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 0, '2,71 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 15 \xd0\xbf\xd0\xbe\xd0\xbb\xd0\xbd\xd1\x8b\xd0\xb9 (14)) (2011) HDTVRip (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=303178&330978', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 1, '7,39 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5 WEB-DLRip (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 (14)) [720p]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=510810&486782', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 6, 3, '2.53 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-9 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9)=\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5=]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-4-seriya-iz-10-south-park-t139331.html?id=724547', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (6, 6, 23, '4.31 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-7 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / 3 x \xd0\x9f\xd0\x9c, 2 x \xd0\x9f\xd0\x94, 2 x \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477387', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (6, 6, 4, '560 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 7-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8) / South Park / 2016 / \xd0\x9f\xd0\x94 (SunshineStudio) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1492410', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 0, '2.76 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9f\xd0\x94 (Paramount Comedy) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1274229', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 6, '4.92 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (Jaskier), \xd0\xa1\xd0\xa2 / HDTVRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477358', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 15, '1.19 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8) / South Park / 2016 / \xd0\x9f\xd0\x9c (Coldfilm) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1476986', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 4, '2.54 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (Jaskier), \xd0\xa1\xd0\xa2 / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477462', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 9, '61.48 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b: 1-273 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 277) / South Park / 1997-2016 / \xd0\x9f\xd0\x9c (Paramount Comedy ex MTV) / HEVC / WEB-DLRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1482039', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 2, 0, '2,51 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 8 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 8 season (2004) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=9410&10281', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '2,82 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 4 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 4 season (2000) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=10086&10948', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '4,3 GB', 'South Park: Bigger Longer & Uncut / \xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbf\xd0\xbe\xd0\xbb\xd0\xbd\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd1\x84\xd0\xb8\xd0\xbb\xd1\x8c\xd0\xbc, \xd0\x93\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xbd) DVD-5', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=42538&43366', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '44,2 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\x92\xd1\x81\xd0\xb5 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=62239&63500', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '3,57 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut (1999) [720p] BDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=150728&152983', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '7,32 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14) / South Park (2012) WEB-DLRip [H.264/720p-LQ]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=510462&558155', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '8,23 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) WEB-DL [H.264/720p-LQ] (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=532312&594562', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '11,9 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) WEB-DLRip [H.264/1080p-LQ] (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16 / \xd0\xad\xd0\xbf\xd0\xb8\xd0\xb7\xd0\xbe\xd0\xb4 1-14 \xd0\xb8\xd0\xb7 14)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=528308&597806', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 4, 0, '3.43 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (17 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb9 \xd0\xb8\xd0\xb7 10) / South Park / 2013 / \xd0\x9f\xd0\x94 (Paramount Comedy) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1155833', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '2.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\xba\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1024129', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '11.86 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / 2 x \xd0\x9f\xd0\x94, \xd0\x9f\xd0\x9c, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1050214', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '2.68 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / \xd0\x9f\xd0\x94 (Paramount Comedy) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1050218', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '4.1 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9b\xd0\x9e (L0cDoG) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1380757', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 7, '2.31 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 19, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8: 1-6, 8-9 \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Paramount Comedy)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-sezon-19-serii-1-6-8-9-iz-10-south-park-t137915.html?id=726250', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (3, 3, 1, '2.27 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9b\xd1\x8e\xd0\xb1\xd0\xb8\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9) - L0cDoG]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-18-seriya-1-t111466.html?id=599823', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (3, 3, 0, '7.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\xba\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1030433', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 9, '174.76 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (3-18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 32-257 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 257) / South Park / 1999-2014 / \xd0\x9f\xd0\x9c, 4 x \xd0\x9f\xd0\x94, \xd0\x9f\xd0\x9e, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1132433', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 0, '2.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9b\xd0\x9e, \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256768', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 2, '28.6 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-2 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-31 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 31) / South Park / 1997-1998 / 3 x \xd0\x9f\xd0\x94, \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2), \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1330595', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 0, '2.85 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9b\xd0\x9e (L0cDoG), \xd0\xa1\xd0\xa2 / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1376594', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 1, 0, '2,32 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba \xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 10 / South Park Season 10 MTV!(2006)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=33856&34674', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '3,42 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: 11 \xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd.(MTV) / South Park 11 Season Complete (2007) [SAT-Rip]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=76759&77067', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '700 MB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba \xd0\x92\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbb\xd1\x8f\xd0\xbd\xd0\xb4\xd0\xb8\xd1\x8f / South Park Imaginationland (2008) DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=114379&115419', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '8,81 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (1997-2008 \xd0\xb3\xd0\xb3.) 11 \xd0\xa1\xd0\x95\xd0\x97\xd0\x9e\xd0\x9d\xd0\x9e\xd0\x92 [DVDRip]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=119670&120391', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 1, '714 MB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba 12 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd / South Park 12 season (2008) DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=133111&133059', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '918 MB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba 13 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd / South Park 13 season (2009)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=131974&133062', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '41 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba 13 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd0\xbe\xd0\xb2 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 MTV + \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\x94\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xb8 \xd0\x9d\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 + \xd0\x92\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbb\xd1\x8f\xd0\xbd\xd0\xb4\xd0\xb8\xd1\x8f (1992-2009) + \xd0\xbc\xd1\x83\xd0\xb7\xd1\x8b\xd0\xba\xd0\xb0 / South Park (1992-2009) DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=180268&185413', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 2, 0, '1.45 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x92\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbb\xd1\x8f\xd0\xbd\xd0\xb4\xd0\xb8\xd1\x8f / South Park: Imaginationland / 2008 / \xd0\x9f\xd0\x9c / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=547097', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 2, 1, '16.54 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (15 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2011 / \xd0\x9f\xd0\x9c, 2 x \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / BDRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=999727', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 2, 0, '5.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (15 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2011 / 2 x \xd0\x9f\xd0\x9c, \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / HDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1000191', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 2, 0, '14.49 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (14 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2010 / \xd0\x9f\xd0\x9c, 2 x \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / BDRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1127883', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (0, 0, 0, '33.24 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 01-19 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-266) [1997-2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, BDRip1080p, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - MTV]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-01-19-seriya-1-266-t163989.html?id=818401', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '349.73 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 19, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f: 7) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Paramount Comedy)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-sezon-19-seriya-7-south-park-t143571.html?id=726424', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 1, '3.78 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DL (720p), \xd0\x9b\xd1\x8e\xd0\xb1\xd0\xb8\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9) - L0cDoG]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-18-seriya-1-t111655.html?id=600621', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '5.35 \xd0\x93\xd0\x91', '[PC] South Park: The Stick of Truth + 1 DLC / South Park: \xd0\x9f\xd0\xb0\xd0\xbb\xd0\xba\xd0\xb0 \xd0\x98\xd1\x81\xd1\x82\xd0\xb8\xd0\xbd\xd1\x8b [RPG] [\xd0\x9b\xd0\xb8\xd1\x86\xd0\xb5\xd0\xbd\xd0\xb7\xd0\xb8\xd1\x8f] [\xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb0\xd0\xbd\xd0\xb3\xd0\xbb\xd0\xb8\xd0\xb9\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd1\x84\xd1\x80\xd0\xb0\xd0\xbd\xd1\x86\xd1\x83\xd0\xb7\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb8\xd1\x82\xd0\xb0\xd0\xbb\xd1\x8c\xd1\x8f\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbc\xd0\xb5\xd1\x86\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb8\xd1\x81\xd0\xbf\xd0\xb0\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb1\xd1\x80\xd0\xb0\xd0\xb7\xd0\xb8\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xbf\xd0\xbe\xd1\x80\xd1\x82\xd1\x83\xd0\xb3\xd0\xb0\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 / ENG] (2014)', 'RiperAM::http://riperam.orghttp://riperam.org/hot-games/south-park-the-stick-of-truth-1-dlc-south-park-palka-istini-2014-t98200.html?id=475637', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '3.9 \xd0\x93\xd0\x91', '[PC] South Park: The Stick of Truth + 1 DLC / South Park: \xd0\x9f\xd0\xb0\xd0\xbb\xd0\xba\xd0\xb0 \xd0\x98\xd1\x81\xd1\x82\xd0\xb8\xd0\xbd\xd1\x8b [RPG] [RePack \xd0\xbe\xd1\x82 R.G. Element Arts] [\xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb0\xd0\xbd\xd0\xb3\xd0\xbb\xd0\xb8\xd0\xb9\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 / ENG] (2014)', 'RiperAM::http://riperam.orghttp://riperam.org/hot-repack-games/south-park-the-stick-of-truth-1-dlc-south-park-palka-istini-2014-t98201.html?id=475645', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '2.17 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 17 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f: 1-10 \xd0\xb8\xd0\xb7 10) [2013, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-17-seriya-1-iz-10-t86496.html?id=473330', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '3.43 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 17 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8: 1-10 \xd0\xb8\xd0\xb7 10) [2013, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-17-seriya-1-iz-10-t86160.html?id=448987', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '2.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14 \xd0\xb8\xd0\xb7 14) [2012, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEBDLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-16-seriya-1-8-iz-14-t56766.html?id=266561', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '38.16 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 1-10 \xd0\xb8\xd0\xb7 16 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-153 \xd0\xb8\xd0\xb7 153) [1997-2007, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, DVDRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-1-10-iz-16-seriya-1-153-iz-153-t56116.html?id=236508', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '2.83 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 14 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14 \xd0\xb8\xd0\xb7 14) (\xd0\xa2\xd1\x80\xd0\xb5\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba\xd0\xb5\xd1\x80, \xd0\x9c\xd1\x8d\xd1\x82\xd1\x82 \xd0\xa1\xd1\x82\xd0\xbe\xd1\x83\xd0\xbd) [2011, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip] \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9, \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) VO-Production', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/south-park-c-14-1-14-14-vo-production-t22103.html?id=25606', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png')] - dialog = MultiChoiceDialog("Select items", items) + + dialog = MultiChoiceDialog("Torrenter Search Window") dialog.doModal() del dialog #You need to delete your instance when it is no longer needed - #because underlying xbmcgui classes are not grabage-collected. \ No newline at end of file + #because underlying xbmcgui classes are not grabage-collected. + + ''' + items = [(1919, 1919, 52, u'102.66 MiB', u'South.Park.S20E06.HDTV.x264-FUM[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:0792ea51bc16a19893871197fa927ecec7ca25aa&dn=South.Park.S20E06.HDTV.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (1545, 1545, 31, u'97.26 MiB', u'South.Park.S20E05.HDTV.x264-KILLERS[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:437487c32ce82f050cdbfccfc04e4e20aca0d4cb&dn=South.Park.S20E05.HDTV.x264-KILLERS%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (1265, 1265, 75, u'89.69 MiB', u'South.Park.S20E07.HDTV.x264-FLEET', u'ThePirateBay::magnet:?xt=urn:btih:a122b0b79c4cbacea959e6e032ab540674ce49eb&dn=South.Park.S20E07.HDTV.x264-FLEET&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (1083, 1083, 9, u'99.5 MiB', u'South.Park.S20E03.PROPER.HDTV.x264-KILLERS[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:ed2806f33629ec637caeabcc25ae1e70d5971ebe&dn=South.Park.S20E03.PROPER.HDTV.x264-KILLERS%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (429, 429, 19, u'85.08 MiB', u'South.Park.S20E08.WEBRip.x264-FUM[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:988728720702c55fd1d19cde10f9af720ed934eb&dn=South.Park.S20E08.WEBRip.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (311, 311, 229, u'251.67 MiB', u'South.Park.S20E08.1080p.HDTV.x264[state]', u'ThePirateBay::magnet:?xt=urn:btih:a5fa25dfccfa43723e34466b47fed2f89dd34072&dn=South.Park.S20E08.1080p.HDTV.x264%5Bstate%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (272, 272, 51, '6.08 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DL (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9, \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-10-seriya-1-iz-10-t111662.html?id=602710', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (237, 237, 6, u'367.96 MiB', u'South.Park.S20E03.720p.HDTV.x264-AVS[rarbg]', u'ThePirateBay::magnet:?xt=urn:btih:a6fd5218db8b5445981ce1466a501ae1e72fc538&dn=South.Park.S20E03.720p.HDTV.x264-AVS%5Brarbg%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (206, 206, 127, '4.1 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) (L0cDoG)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-8-seriya-iz-10-south-park-t141746.html?id=725943', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (168, 168, 3, u'184.19 MiB', u'South.Park.S20E08.Members.Only.720p.WEBRip.AAC2.0.H.264.mkv', u'ThePirateBay::magnet:?xt=urn:btih:0647e29a5a9b96f91f97f73bb010e8eb9aca66b7&dn=South.Park.S20E08.Members.Only.720p.WEBRip.AAC2.0.H.264.mkv&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (154, 154, 62, '6.51 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-5-seriya-iz-10-south-park-t137088.html?id=727333', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (154, 154, 87, '3.33 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) (L0cDoG)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-8-seriya-iz-10-south-park-t141747.html?id=725945', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (140, 140, 5, u'81.54 MiB', u'South Park S20E08 720p Uncensored Web-DL EN-Sub x264-[MULVAcoded', u'ThePirateBay::magnet:?xt=urn:btih:2491997192df91dd3581db848f0c998d90b1ea09&dn=South+Park+S20E08+720p+Uncensored+Web-DL+EN-Sub+x264-%5BMULVAcoded&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (135, 135, 44, '2.13 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-5-seriya-iz-10-south-park-t137089.html?id=727335', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (118, 118, 12, u'1.38 GiB', u'South.Park.Season.17.Complete.UNCENSORED.720p.WEB-DL.x264.AAC', u'ThePirateBay::magnet:?xt=urn:btih:e92aa604285e189749bb2ce7d5e90e2dca726192&dn=South.Park.Season.17.Complete.UNCENSORED.720p.WEB-DL.x264.AAC&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (116, 116, 2, u'843.03 MiB', u'South.Park.S20E06.Fort.Collins.UNCENSORED.1080p.WEB-DL.H.264-YFN', u'ThePirateBay::magnet:?xt=urn:btih:1c4f30359538f253efc5a292101abb8520406131&dn=South.Park.S20E06.Fort.Collins.UNCENSORED.1080p.WEB-DL.H.264-YFN&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (113, 113, 226, '90.71 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 1-19 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-267 \xd0\xb8\xd0\xb7 267) [1997-2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEBDLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - "Paramount Comedy" ex-MTV]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-18-seriya-1-iz-10-t112158.html?id=771968', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (112, 56, 22, '2,21 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2016) HDTVRip (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-8 \xd0\xb8\xd0\xb7 10) L0cDoG (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=887776&1064662', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (109, 109, 2, u'348.34 MiB', u'South Park 20x07 (720p-HDTV-x264-AVS)[VTV]', u'ThePirateBay::magnet:?xt=urn:btih:06cae396d7276a2e81fe4bd9ca251d59559f2de1&dn=South+Park+20x07+%28720p-HDTV-x264-AVS%29%5BVTV%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (104, 104, 2, u'198.98 MiB', u'South park Season 20 Episode 2', u'ThePirateBay::magnet:?xt=urn:btih:89da24875fd84560a7603baa43e6dc92f6fd4b2a&dn=South+park+Season+20+Episode+2&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (102, 102, 2, u'838.68 MiB', u'South.Park.S20E04.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN', u'ThePirateBay::magnet:?xt=urn:btih:f85c28858b7609c4590294d21ead0330bdd18bb8&dn=South.Park.S20E04.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (100, 50, 9, '6,49 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2016) HDTV [H.264/1080p] (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-7 \xd0\xb8\xd0\xb7 10) Jaskier (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=883108&1058210', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (100, 100, 3, u'840.48 MiB', u'South.Park.S20E05.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN', u'ThePirateBay::magnet:?xt=urn:btih:88c67280085a2f75e4cc0c79968735d33eb901cb&dn=South.Park.S20E05.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (92, 46, 1, '7,91 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2015) WEB-DL [H.264/720p] (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 01-10 \xd0\xb8\xd0\xb7 10)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=798266&940469', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (79, 79, 90, '2.3 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-20-sezon-1-2-seriya-iz-10-south-park-t163180.html?id=833923', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (79, 79, 132, '5.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-20-sezon-1-2-seriya-iz-10-south-park-t163179.html?id=833921', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (55, 55, 100, '6.49 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (1080p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Jaskier)]', 'RiperAM::http://riperam.orghttp://riperam.org/zar-multseriali/ujniy-park-20-sezon-1-8-seriya-iz-10-south-park-t165730.html?id=834562', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (51, 51, 11, '1.56 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477787', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (48, 24, 9, '56,1 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (1997-2014) DVDRip/WebDL (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd0\xbe\xd0\xb2 + \xd1\x81\xd0\xb0\xd0\xbc\xd1\x8b\xd0\xb5 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb2\xd1\x8b\xd0\xb5 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 + \xd0\xbf\xd0\xbe\xd0\xbb\xd0\xbd\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x84\xd0\xb8\xd0\xbb\xd1\x8c\xd0\xbc)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=625124&191859', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (48, 24, 0, '2,57 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South park (2014) HDRip [\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18, 10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb9 \xd0\xb8\xd0\xb7 10] (Paramount comedy)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=734132&852853', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (46, 46, 31, '5.95 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 13 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14 \xd0\xb8\xd0\xb7 14) (\xd0\xa2\xd1\x80\xd0\xb5\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba\xd0\xb5\xd1\x80, \xd0\x9c\xd1\x8d\xd1\x82\xd1\x82 \xd0\xa1\xd1\x82\xd0\xbe\xd1\x83\xd0\xbd) [2009, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, BDRip] \xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xbf\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 (MTV) + \xd0\x9e\xd1\x80\xd0\xb8\xd0\xb3\xd0\xb8\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xb4\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb6\xd0\xba\xd0\xb0 + \xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xbf\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 (V\xd0\xbe-production) + \xd0\x9e\xd1\x80\xd0\xb8\xd0\xb3\xd0\xb8\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xb4\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb6\xd0\xba', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/south-park-c-13-1-14-14-mtv-v-production-t22400.html?id=25896', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (44, 22, 22, '5,01 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2016) (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 20, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-8 \xd0\xb8\xd0\xb7 10) HDTVRip [H.264/720p-LQ] (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=894777&1073915', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (44, 44, 148, '3.36 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Jaskier)]', 'RiperAM::http://riperam.orghttp://riperam.org/zar-multseriali/ujniy-park-20-sezon-1-8-seriya-iz-10-south-park-t165731.html?id=834794', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (42, 21, 1, '2,63 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2015) WEB-DLRip (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 01-10 \xd0\xb8\xd0\xb7 10) [DVO \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=798225&940413', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (39, 39, 34, '4.67 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477518', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (34, 34, 35, '5.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-7 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x94 (Paramount Comedy) / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1479186', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (30, 30, 6, '2 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9, \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-10-seriya-1-iz-10-t111661.html?id=602030', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (27, 27, 6, '9.47 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / 2 x \xd0\x9f\xd0\x94, 2 x \xd0\x9f\xd0\x9c, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1385080', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (26, 13, 1, '4,27 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2015) HDTVRip [H.264/720p-LQ] (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 01-10 \xd0\xb8\xd0\xb7 10) Jaskier', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=815441&964692', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (22, 22, 24, '90.71 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park / 1997-2015 / \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=484607', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (20, 10, 0, '5,62 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (2013) WEB-DL [H.264/720p-LQ] (17 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-10 \xd0\xb8\xd0\xb7 10) (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f) [18+]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=616639&706224', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (19, 19, 0, '2.81 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1377091', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (18, 9, 0, '2,59 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South park (2013) HDRip [\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 17, 10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb9 \xd0\xb8\xd0\xb7 10] (Comedy central)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=728154&845636', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (18, 18, 12, '600 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 7-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8) / South Park / 2016 / \xd0\x9f\xd0\x94 (SunshineStudio) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1492411', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (17, 17, 0, '1.08 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba: \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xb8 \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\x93\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xbd) / South Park: Bigger, Longer & Uncut / 1999 / \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2) / HDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=848584', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (14, 7, 1, '2,96 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) WEB-DLRip (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14) (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=509439&483626', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (14, 14, 3, '2.71 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 15 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14) [2011, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x90\xd0\xbd\xd0\xb8\xd0\xbc\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, WEB-DLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-15-seriya-1-14-t43885.html?id=168699', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (12, 12, 1, '2.61 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6, 8-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x9c (Paramount Comedy), \xd0\xa1\xd0\xa2 / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1378559', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (12, 12, 16, '1.66 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9b\xd0\x9e (L0cDoG) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477158', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (12, 12, 29, '4.72 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (Coldfilm) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1476989', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (11, 11, 0, '2.17 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (17 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2013 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1128747', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (11, 11, 1, '2 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256710', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (10, 5, 0, '19,1 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut (1999) BDRemux [1080p]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=606749&694448', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (10, 10, 0, '6.72 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1377313', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 0, '7.2 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / 2 x \xd0\x9f\xd0\x94, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256573', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 11, '114.84 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (2-18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 14-257 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 257) / South Park / 1998-2014 / \xd0\x9f\xd0\x9c, 5 x \xd0\x9f\xd0\x94, \xd0\x9f\xd0\x9e, \xd0\x90\xd0\x9f, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1121230', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 1, '6.08 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256771', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 3, '7.91 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / 2 x \xd0\x9f\xd0\x94, 2 x \xd0\x9f\xd0\x9c, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1384013', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 0, '8.18 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut / 1999 / \xd0\x9f\xd0\x9c, 3 x \xd0\x90\xd0\x9f, \xd0\xa1\xd0\xa2 / BDRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1198585', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 0, '412 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9b\xd0\x9e (L0cDoG) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1476939', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 4, 0, '2,38 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 2 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 2 season (1998) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=9947&10798', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (8, 4, 0, '2,57 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 3 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 3 season (1999) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=10082&10944', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (8, 4, 0, '7,48 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (15 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14) (2011) [H.264/720p-LQ] WEB-DL', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=525722&594572', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (8, 8, 7, '48.9 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-11 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park / 1997-2007 / \xd0\x9f\xd0\x9c / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=368930', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 8, 4, '6.92 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba (1-2 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park / 1997-1998 / \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2) / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=672637', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 8, 15, '2.3 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (IdeaFilm) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477174', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 8, 2, '8.28 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1377153', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (7, 7, 0, '4.61 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 19, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8: 1-6, 8 \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DL (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Paramount Comedy)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-sezon-19-serii-1-6-8-iz-10-south-park-t137916.html?id=721091', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (7, 7, 45, '5.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (IdeaFilm) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477176', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (7, 7, 0, '1.37 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba: \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xb8 \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger, Longer & Uncut / 1999 / \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2) / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=371714', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (6, 3, 0, '2,03 GB', 'South Park /\xd0\xa1\xd0\xb0\xd1\x83\xd1\x82-\xd0\x9f\xd0\xb0\xd1\x80\xd0\xba 9 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd MTV', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=5373&6079', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 0, '694 MB', '\xd0\xa1\xd0\xb0\xd1\x83\xd1\x82 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut (1999) DVDrip (\xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 \xd0\x93\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xb0)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=5835&6569', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 0, '87,6 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba \xd0\x9a\xd0\xbe\xd0\xbb\xd0\xbb\xd0\xb5\xd0\xba\xd1\x86\xd0\xb8\xd1\x8f / South Park Collection (1997-2010) DVDRip, BDRip, WebDL (1-13 \xd0\xb8 14 (1-7 \xd1\x8d\xd0\xbf.) c\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=245759&260814', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 0, '2,71 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 15 \xd0\xbf\xd0\xbe\xd0\xbb\xd0\xbd\xd1\x8b\xd0\xb9 (14)) (2011) HDTVRip (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=303178&330978', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 1, '7,39 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5 WEB-DLRip (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 (14)) [720p]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=510810&486782', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 6, 3, '2.53 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-9 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9)=\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5=]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-4-seriya-iz-10-south-park-t139331.html?id=724547', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (6, 6, 23, '4.31 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-7 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / 3 x \xd0\x9f\xd0\x9c, 2 x \xd0\x9f\xd0\x94, 2 x \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477387', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (6, 6, 4, '560 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 7-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8) / South Park / 2016 / \xd0\x9f\xd0\x94 (SunshineStudio) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1492410', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 0, '2.76 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9f\xd0\x94 (Paramount Comedy) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1274229', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 6, '4.92 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (Jaskier), \xd0\xa1\xd0\xa2 / HDTVRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477358', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 15, '1.19 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8) / South Park / 2016 / \xd0\x9f\xd0\x9c (Coldfilm) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1476986', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 4, '2.54 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (Jaskier), \xd0\xa1\xd0\xa2 / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477462', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 9, '61.48 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b: 1-273 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 277) / South Park / 1997-2016 / \xd0\x9f\xd0\x9c (Paramount Comedy ex MTV) / HEVC / WEB-DLRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1482039', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 2, 0, '2,51 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 8 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 8 season (2004) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=9410&10281', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '2,82 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 4 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 4 season (2000) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=10086&10948', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '4,3 GB', 'South Park: Bigger Longer & Uncut / \xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbf\xd0\xbe\xd0\xbb\xd0\xbd\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd1\x84\xd0\xb8\xd0\xbb\xd1\x8c\xd0\xbc, \xd0\x93\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xbd) DVD-5', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=42538&43366', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '44,2 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\x92\xd1\x81\xd0\xb5 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=62239&63500', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '3,57 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut (1999) [720p] BDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=150728&152983', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '7,32 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14) / South Park (2012) WEB-DLRip [H.264/720p-LQ]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=510462&558155', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '8,23 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) WEB-DL [H.264/720p-LQ] (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=532312&594562', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '11,9 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) WEB-DLRip [H.264/1080p-LQ] (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16 / \xd0\xad\xd0\xbf\xd0\xb8\xd0\xb7\xd0\xbe\xd0\xb4 1-14 \xd0\xb8\xd0\xb7 14)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=528308&597806', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 4, 0, '3.43 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (17 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb9 \xd0\xb8\xd0\xb7 10) / South Park / 2013 / \xd0\x9f\xd0\x94 (Paramount Comedy) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1155833', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '2.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\xba\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1024129', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '11.86 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / 2 x \xd0\x9f\xd0\x94, \xd0\x9f\xd0\x9c, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1050214', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '2.68 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / \xd0\x9f\xd0\x94 (Paramount Comedy) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1050218', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '4.1 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9b\xd0\x9e (L0cDoG) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1380757', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 7, '2.31 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 19, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8: 1-6, 8-9 \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Paramount Comedy)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-sezon-19-serii-1-6-8-9-iz-10-south-park-t137915.html?id=726250', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (3, 3, 1, '2.27 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9b\xd1\x8e\xd0\xb1\xd0\xb8\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9) - L0cDoG]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-18-seriya-1-t111466.html?id=599823', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (3, 3, 0, '7.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\xba\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1030433', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 9, '174.76 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (3-18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 32-257 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 257) / South Park / 1999-2014 / \xd0\x9f\xd0\x9c, 4 x \xd0\x9f\xd0\x94, \xd0\x9f\xd0\x9e, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1132433', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 0, '2.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9b\xd0\x9e, \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256768', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 2, '28.6 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-2 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-31 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 31) / South Park / 1997-1998 / 3 x \xd0\x9f\xd0\x94, \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2), \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1330595', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 0, '2.85 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9b\xd0\x9e (L0cDoG), \xd0\xa1\xd0\xa2 / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1376594', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 1, 0, '2,32 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba \xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 10 / South Park Season 10 MTV!(2006)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=33856&34674', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '3,42 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: 11 \xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd.(MTV) / South Park 11 Season Complete (2007) [SAT-Rip]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=76759&77067', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '700 MB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba \xd0\x92\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbb\xd1\x8f\xd0\xbd\xd0\xb4\xd0\xb8\xd1\x8f / South Park Imaginationland (2008) DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=114379&115419', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '8,81 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (1997-2008 \xd0\xb3\xd0\xb3.) 11 \xd0\xa1\xd0\x95\xd0\x97\xd0\x9e\xd0\x9d\xd0\x9e\xd0\x92 [DVDRip]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=119670&120391', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 1, '714 MB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba 12 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd / South Park 12 season (2008) DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=133111&133059', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '918 MB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba 13 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd / South Park 13 season (2009)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=131974&133062', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '41 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba 13 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd0\xbe\xd0\xb2 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 MTV + \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\x94\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xb8 \xd0\x9d\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 + \xd0\x92\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbb\xd1\x8f\xd0\xbd\xd0\xb4\xd0\xb8\xd1\x8f (1992-2009) + \xd0\xbc\xd1\x83\xd0\xb7\xd1\x8b\xd0\xba\xd0\xb0 / South Park (1992-2009) DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=180268&185413', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 2, 0, '1.45 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x92\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbb\xd1\x8f\xd0\xbd\xd0\xb4\xd0\xb8\xd1\x8f / South Park: Imaginationland / 2008 / \xd0\x9f\xd0\x9c / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=547097', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 2, 1, '16.54 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (15 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2011 / \xd0\x9f\xd0\x9c, 2 x \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / BDRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=999727', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 2, 0, '5.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (15 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2011 / 2 x \xd0\x9f\xd0\x9c, \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / HDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1000191', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 2, 0, '14.49 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (14 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2010 / \xd0\x9f\xd0\x9c, 2 x \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / BDRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1127883', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (0, 0, 0, '33.24 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 01-19 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-266) [1997-2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, BDRip1080p, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - MTV]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-01-19-seriya-1-266-t163989.html?id=818401', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '349.73 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 19, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f: 7) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Paramount Comedy)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-sezon-19-seriya-7-south-park-t143571.html?id=726424', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 1, '3.78 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DL (720p), \xd0\x9b\xd1\x8e\xd0\xb1\xd0\xb8\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9) - L0cDoG]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-18-seriya-1-t111655.html?id=600621', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '5.35 \xd0\x93\xd0\x91', '[PC] South Park: The Stick of Truth + 1 DLC / South Park: \xd0\x9f\xd0\xb0\xd0\xbb\xd0\xba\xd0\xb0 \xd0\x98\xd1\x81\xd1\x82\xd0\xb8\xd0\xbd\xd1\x8b [RPG] [\xd0\x9b\xd0\xb8\xd1\x86\xd0\xb5\xd0\xbd\xd0\xb7\xd0\xb8\xd1\x8f] [\xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb0\xd0\xbd\xd0\xb3\xd0\xbb\xd0\xb8\xd0\xb9\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd1\x84\xd1\x80\xd0\xb0\xd0\xbd\xd1\x86\xd1\x83\xd0\xb7\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb8\xd1\x82\xd0\xb0\xd0\xbb\xd1\x8c\xd1\x8f\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbc\xd0\xb5\xd1\x86\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb8\xd1\x81\xd0\xbf\xd0\xb0\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb1\xd1\x80\xd0\xb0\xd0\xb7\xd0\xb8\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xbf\xd0\xbe\xd1\x80\xd1\x82\xd1\x83\xd0\xb3\xd0\xb0\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 / ENG] (2014)', 'RiperAM::http://riperam.orghttp://riperam.org/hot-games/south-park-the-stick-of-truth-1-dlc-south-park-palka-istini-2014-t98200.html?id=475637', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '3.9 \xd0\x93\xd0\x91', '[PC] South Park: The Stick of Truth + 1 DLC / South Park: \xd0\x9f\xd0\xb0\xd0\xbb\xd0\xba\xd0\xb0 \xd0\x98\xd1\x81\xd1\x82\xd0\xb8\xd0\xbd\xd1\x8b [RPG] [RePack \xd0\xbe\xd1\x82 R.G. Element Arts] [\xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb0\xd0\xbd\xd0\xb3\xd0\xbb\xd0\xb8\xd0\xb9\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 / ENG] (2014)', 'RiperAM::http://riperam.orghttp://riperam.org/hot-repack-games/south-park-the-stick-of-truth-1-dlc-south-park-palka-istini-2014-t98201.html?id=475645', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '2.17 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 17 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f: 1-10 \xd0\xb8\xd0\xb7 10) [2013, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-17-seriya-1-iz-10-t86496.html?id=473330', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '3.43 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 17 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8: 1-10 \xd0\xb8\xd0\xb7 10) [2013, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-17-seriya-1-iz-10-t86160.html?id=448987', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '2.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14 \xd0\xb8\xd0\xb7 14) [2012, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEBDLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-16-seriya-1-8-iz-14-t56766.html?id=266561', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '38.16 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 1-10 \xd0\xb8\xd0\xb7 16 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-153 \xd0\xb8\xd0\xb7 153) [1997-2007, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, DVDRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-1-10-iz-16-seriya-1-153-iz-153-t56116.html?id=236508', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '2.83 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 14 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14 \xd0\xb8\xd0\xb7 14) (\xd0\xa2\xd1\x80\xd0\xb5\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba\xd0\xb5\xd1\x80, \xd0\x9c\xd1\x8d\xd1\x82\xd1\x82 \xd0\xa1\xd1\x82\xd0\xbe\xd1\x83\xd0\xbd) [2011, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip] \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9, \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) VO-Production', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/south-park-c-14-1-14-14-vo-production-t22103.html?id=25606', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png')] + ''' \ No newline at end of file From a20b7d20696d733c511ea97535c3bde47874ad38 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sun, 27 Nov 2016 16:11:15 +0300 Subject: [PATCH 027/126] possible fuckup --- Inposloader.py | 4 ++-- SkorbaLoader.py | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Inposloader.py b/Inposloader.py index bd5f2eb..66ab797 100644 --- a/Inposloader.py +++ b/Inposloader.py @@ -29,7 +29,7 @@ import xbmcgui import xbmcvfs import xbmcaddon import Localization -from functions import encode_msg, isSubtitle, is_writable, file_url +from functions import encode_msg, isSubtitle, is_writable, file_url, localize_path import os @@ -166,7 +166,7 @@ class InposLoader: return self.torrentFile else: if not xbmcvfs.exists(self.torrentFilesPath): xbmcvfs.mkdirs(self.torrentFilesPath) - torrentFile = os.path.join(self.torrentFilesPath, self.md5(torrentUrl) + '.torrent') + torrentFile = localize_path(os.path.join(self.torrentFilesPath, self.md5(torrentUrl) + '.torrent')) try: if not re.match("^http\:.+$", torrentUrl): content = xbmcvfs.File(torrentUrl, "rb").read() diff --git a/SkorbaLoader.py b/SkorbaLoader.py index 5fd2afe..813c2e0 100644 --- a/SkorbaLoader.py +++ b/SkorbaLoader.py @@ -93,8 +93,7 @@ class SkorbaLoader: else: if not xbmcvfs.exists(self.torrentFilesPath): xbmcvfs.mkdirs(self.torrentFilesPath) - torrentFile = self.torrentFilesPath + self.md5( - torrentUrl) + '.torrent' + torrentFile = localize_path(os.path.join(self.torrentFilesPath, self.md5(torrentUrl) + '.torrent')) try: if not re.match("^http\:.+$", torrentUrl): contentFile = xbmcvfs.File(torrentUrl, "rb") From 81d4e22eed2dfce3ea97f30928e18dbfdedfee0b Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sun, 27 Nov 2016 16:12:06 +0300 Subject: [PATCH 028/126] window torrent browser and play --- functions.py | 57 +++++++++++++++ searchwindow.py | 190 ++++++++++++++++++++++++++++++++++-------------- 2 files changed, 192 insertions(+), 55 deletions(-) diff --git a/functions.py b/functions.py index e0d0132..4bd2972 100644 --- a/functions.py +++ b/functions.py @@ -44,6 +44,7 @@ __settings__ = xbmcaddon.Addon(id='plugin.video.torrenter') __language__ = __settings__.getLocalizedString ROOT = __settings__.getAddonInfo('path') # .decode('utf-8').encode(sys.getfilesystemencoding()) userStorageDirectory = __settings__.getSetting("storage") +torrentFilesDirectory = 'torrents' USERAGENT = "Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.0" __addonpath__ = __settings__.getAddonInfo('path') icon = os.path.join(__addonpath__, 'icon.png') @@ -1309,6 +1310,62 @@ def search(url, searchersList, isApi=None): filesList.extend(result[k]) return filesList +def get_filesList(query, addtime = None): + if __settings__.getSetting('history')=='true': + HistoryDB().add(query) + searchersList = [] + if addtime: + providers=HistoryDB().get_providers(addtime) + if providers: + for searcher in providers: + searchersList.append(searcher) + if not addtime or not searchersList: + searchersList = Searchers().get_active() + + filesList=search(query, searchersList) + if __settings__.getSetting('sort_search')=='true': + __settings__.setSetting('sort_search','1') + if int(__settings__.getSetting('sort_search'))==0: + filesList = sorted(filesList, key=lambda x: x[0], reverse=True) + elif int(__settings__.getSetting('sort_search'))==2: + filesList = sorted(filesList, key=lambda x: x[4], reverse=False) + + debug('get_filesList filesList: '+str(filesList)) + + return filesList + +def get_contentList(url): + import Downloader + + url = urllib.unquote_plus(url) + + __settings__.setSetting("lastTorrentUrl", url) + classMatch = re.search('(\w+)::(.+)', url) + if classMatch: + searcher = classMatch.group(1) + url = Searchers().downloadWithSearcher(classMatch.group(2), searcher) + __settings__.setSetting("lastTorrent", url) + + torrent = Downloader.Torrent(userStorageDirectory, torrentFilesDirectory=torrentFilesDirectory) + + __settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) + + append_filesize = __settings__.getSetting("append_filesize") == 'true' + + contentList = [] + for filedict in torrent.getContentList(): + fileTitle = filedict.get('title') + size = filedict.get('size') + if size: + if append_filesize: + fileTitle += ' [%d MB]' % (size / 1024 / 1024) + + contentList.append([unescape(fileTitle), str(filedict.get('ind')), size]) + # contentList = sorted(contentList, key=lambda x: x[0]) + + debug('get_contentList contentList: ' + str(contentList)) + + return contentList def join_list(l, char=', ', replace=''): string='' diff --git a/searchwindow.py b/searchwindow.py index 77b0b17..de653c8 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -17,12 +17,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . ''' -import sys, os, urllib +import sys, os, urllib, json import xbmcaddon import xbmc import xbmcgui -from functions import search, HistoryDB, Searchers, log +from functions import get_filesList, HistoryDB, get_contentList, log, cutFolder, get_ids_video import pyxbmct.addonwindow as pyxbmct import Localization @@ -38,6 +38,12 @@ log('SYS ARGV: ' + str(sys.argv)) class MultiChoiceDialog(pyxbmct.AddonDialogWindow): __settings__ = sys.modules["__main__"].__settings__ fileList = [] + contentList = [] + right_buttons_count = 6 + last_right_buttons_count = 0 + last_link = None + last_query = None + last_action = None def __init__(self, title=""): super(MultiChoiceDialog, self).__init__(title) @@ -51,14 +57,12 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): return '%s/icons/%s.png' %(__root__, icon) def set_controls(self): - self.input_search = pyxbmct.Edit("") + self.input_search = pyxbmct.Edit("", _alignment=pyxbmct.ALIGN_CENTER_X | pyxbmct.ALIGN_CENTER_Y) self.placeControl(self.input_search, 0, 0, 1, 5) self.button_search = pyxbmct.Button("Search") self.placeControl(self.button_search, 0, 5, 1, 2) self.button_history = pyxbmct.Button("History") self.placeControl(self.button_history, 0, 7, 1, 2) - self.button_right1 = pyxbmct.Button("Open") - self.placeControl(self.button_right1, 1, 14, 1, 2) self.right_menu() self.listing = pyxbmct.List(_imageWidth=40, _imageHeight=40, _itemTextXOffset=10, _itemTextYOffset=2, _itemHeight=40, _space=2, _alignmentY=4) @@ -69,79 +73,108 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): self.connect(self.listing, self.press) self.connect(self.button_history, self.history) self.connect(self.button_search, self.search) + #self.connectEventList([ACTION_ENTER], self.search) def set_navigation(self): #Top menu - self.input_search.setNavigation(self.listing, self.listing, self.button_history, self.button_search) + self.input_search.setNavigation(self.listing, self.listing, self.button_right1, self.button_search) self.button_search.setNavigation(self.listing, self.listing, self.input_search, self.button_history) - self.button_history.setNavigation(self.listing, self.listing, self.button_search, self.input_search) + self.button_history.setNavigation(self.listing, self.listing, self.button_search, self.button_right1) #Listing self.listing.setNavigation(self.input_search, self.input_search, self.input_search, self.button_right1) #Right menu - self.button_right1.setNavigation(self.button_history, self.listing, self.listing, self.input_search) + self.button_right1.setNavigation(self.button_history, self.button_right2, self.listing, self.input_search) + self.button_right2.setNavigation(self.button_right1, self.button_right3, self.listing, self.input_search) + self.button_right3.setNavigation(self.button_right2, self.button_right4, self.listing, self.input_search) + self.button_right4.setNavigation(self.button_right3, self.button_right5, self.listing, self.input_search) + self.button_right5.setNavigation(self.button_right4, self.button_right6, self.listing, self.input_search) + self.button_right6.setNavigation(self.button_right5, self.button_right1, self.listing, self.input_search) if self.listing.size(): self.setFocus(self.listing) else: self.setFocus(self.input_search) + + def setAnimation(self, control): # Set fade animation for all add-on window controls control.setAnimations([('WindowOpen', 'effect=fade start=0 end=100 time=500',), ('WindowClose', 'effect=fade start=100 end=0 time=500',)]) def search(self, addtime=None): + self.last_action = self.search + self.right_menu('search') self.listing.reset() query = self.input_search.getText() log('Search query: '+str(query)) - if len(query)>0: - self.filesList = self.get_filesList(query, addtime) - else: + #cache + if query != self.last_query and len(query)>0: + self.filesList = get_filesList(query, addtime) + self.last_query = query + elif len(query)==0: self.filesList = [(1919, 1919, 52, u'102.66 MiB', u'South.Park.S20E06.HDTV.x264-FUM[ettv]', - u'ThePirateBay::magnet:?xt=urn:btih:0792ea51bc16a19893871197fa927ecec7ca25aa&dn=South.Park.S20E06.HDTV.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', - 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png')] + u'ThePirateBay::magnet:?xt=urn:btih:0792ea51bc16a19893871197fa927ecec7ca25aa&dn=South.Park.S20E06.HDTV.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', + 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), + (1919, 1919, 52, u'102.66 MiB', u'Haruhi', + u'D:\\htest.torrent', + 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png') ] if 1==1: for (order, seeds, leechers, size, title, link, image) in self.filesList: title = titleMake(seeds, leechers, size, title) #log(title) - listitem = xbmcgui.ListItem(title, "", image, '', '') - listitem.setInfo(type='Video', infoLabels={}) - contextMenu = [(self.localize('Search Control Window'), - 'xbmc.RunScript(%s,)' % os.path.join(__root__, 'controlcenter.py'))] - replaceMenu = False - listitem.addContextMenuItems(contextMenu, replaceItems=replaceMenu) - self.listing.addItem(listitem) - - def get_filesList(self, query, addtime = None): - if self.__settings__.getSetting('history')=='true': - HistoryDB().add(query) - searchersList = [] - if addtime: - providers=HistoryDB().get_providers(addtime) - if providers: - for searcher in providers: - searchersList.append(searcher) - if not addtime or not searchersList: - searchersList = Searchers().get_active() - - filesList=search(query, searchersList) - if self.__settings__.getSetting('sort_search')=='true': - self.__settings__.setSetting('sort_search','1') - if int(self.__settings__.getSetting('sort_search'))==0: - filesList = sorted(filesList, key=lambda x: x[0], reverse=True) - elif int(self.__settings__.getSetting('sort_search'))==2: - filesList = sorted(filesList, key=lambda x: x[4], reverse=False) - - log('get_filesList filesList: '+str(filesList)) - - return filesList + self.drawItem(title, 'search_item', link, image) def press(self): - #self.filesList = sorted(self.filesList, key=lambda x: x[1], reverse=True) - #self.items() - log(self.listing.getSelectedItem().getLabel()) - xbmcgui.Dialog().ok('yyy', 'yyy') + item = self.listing.getSelectedItem() + params = json.loads(item.getLabel2()) + mode = params.get('mode') + filename = item.getfilename() + label = item.getLabel() + tdir = params.get('tdir') + self.listing.reset() + if mode == 'search_item': + self.open_torrent(filename) + elif mode == 'torrent_subfolder': + self.open_torrent(filename, tdir) + elif mode == 'torrent_moveup': + self.last_action() + elif mode == 'torrent_play': + action = 'playTorrent' + log('params: '+str(params)) + url = self.form_link(action, params) + log('url: '+url) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + self.close() + + def open_torrent(self, link, tdir = None): + #cache + if link != self.last_link: + self.contentList = get_contentList(link) + self.last_link = link + + dirList, contentListNew = cutFolder(self.contentList, tdir) + + if not tdir: + self.drawItem('..', 'torrent_moveup', link, isFolder=True) + else: + params = {'mode': 'torrent_subfolder'} + self.drawItem('..', params, link, isFolder=True) + + for title in dirList: + self.drawItem(title, {'mode':'torrent_subfolder', 'tdir': title}, link, isFolder=True) + + ids_video_result = get_ids_video(contentListNew) + ids_video='' + + if len(ids_video_result)>0: + for identifier in ids_video_result: + ids_video = ids_video + str(identifier) + ',' + + for title, identifier, filesize in contentListNew: + params = {'mode': 'torrent_play', 'url': identifier, 'url2': ids_video.rstrip(',')} + self.drawItem(title, params, link) def history(self): self.right_menu('history') @@ -150,14 +183,42 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): xbmcgui.Dialog().ok('xxx','xxx') log('history_search: '+self.listing.getSelectedItem().getLabel()) - def right_menu(self, mode='search'): - if mode == 'search': + def right_menu(self, mode='place'): + if not mode == 'place': + self.last_right_buttons_count = self.right_buttons_count + + if mode == 'place': + self.button_right1 = pyxbmct.Button("Empty") + self.button_right2 = pyxbmct.Button("Empty") + self.button_right3 = pyxbmct.Button("Empty") + self.button_right4 = pyxbmct.Button("Empty") + self.button_right5 = pyxbmct.Button("Empty") + self.button_right6 = pyxbmct.Button("Empty") + + elif mode == 'search': + self.right_buttons_count = 3 self.button_right1.setLabel("Open") self.connect(self.button_right1, self.press) + self.connect(self.button_right1, self.press) + self.button_right2.setLabel("Open2") + self.button_right3.setLabel("Open3") + elif mode == 'history': + self.right_buttons_count = 5 self.button_right1.setLabel("Search") self.connect(self.button_right1, self.history_search) self.connect(self.button_right1, self.history_search) + self.button_right2.setLabel("Open2") + self.button_right3.setLabel("Open3") + self.button_right4.setLabel("Open2") + self.button_right5.setLabel("Open3") + + control_list = [self.button_right1, self.button_right2, self.button_right3, self.button_right4, self.button_right5, self.button_right6] + if self.last_right_buttons_count > self.right_buttons_count: + self.removeControls(control_list[self.right_buttons_count:self.last_right_buttons_count]) + elif self.last_right_buttons_count < self.right_buttons_count: + for button in control_list[self.last_right_buttons_count:self.right_buttons_count]: + self.placeControl(button, control_list.index(button)+1, 14, 1, 2) def localize(self, string): try: @@ -165,6 +226,29 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): except: return string + def drawItem(self, title, params, link, image = None, isFolder = False): + if isinstance(params, str): + params = {'mode': params} + + if not image and isFolder: + image = 'DefaultFolder.png' + elif not image: + image = 'DefaultVideo.png' + listitem = xbmcgui.ListItem(title, json.dumps(params), image, image, link) + self.listing.addItem(listitem) + + def form_link(self, action, link): + if isinstance(link, dict): + link_url = '' + for key in link.keys(): + if link.get(key) and key != 'mode': + link_url = '%s&%s=%s' % (link_url, key, urllib.quote_plus(link.get(key))) + url = '%s?action=%s' % ('plugin://plugin.video.torrenter/', action) + link_url + else: + url = '%s?action=%s&url=%s' % ('plugin://plugin.video.torrenter/', action, urllib.quote_plus(link)) + + return url + def log(msg): try: xbmc.log("### [%s]: %s" % (__plugin__,msg,), level=xbmc.LOGNOTICE ) @@ -194,8 +278,4 @@ if __name__ == "__main__": dialog = MultiChoiceDialog("Torrenter Search Window") dialog.doModal() del dialog #You need to delete your instance when it is no longer needed - #because underlying xbmcgui classes are not grabage-collected. - - ''' - items = [(1919, 1919, 52, u'102.66 MiB', u'South.Park.S20E06.HDTV.x264-FUM[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:0792ea51bc16a19893871197fa927ecec7ca25aa&dn=South.Park.S20E06.HDTV.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (1545, 1545, 31, u'97.26 MiB', u'South.Park.S20E05.HDTV.x264-KILLERS[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:437487c32ce82f050cdbfccfc04e4e20aca0d4cb&dn=South.Park.S20E05.HDTV.x264-KILLERS%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (1265, 1265, 75, u'89.69 MiB', u'South.Park.S20E07.HDTV.x264-FLEET', u'ThePirateBay::magnet:?xt=urn:btih:a122b0b79c4cbacea959e6e032ab540674ce49eb&dn=South.Park.S20E07.HDTV.x264-FLEET&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (1083, 1083, 9, u'99.5 MiB', u'South.Park.S20E03.PROPER.HDTV.x264-KILLERS[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:ed2806f33629ec637caeabcc25ae1e70d5971ebe&dn=South.Park.S20E03.PROPER.HDTV.x264-KILLERS%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (429, 429, 19, u'85.08 MiB', u'South.Park.S20E08.WEBRip.x264-FUM[ettv]', u'ThePirateBay::magnet:?xt=urn:btih:988728720702c55fd1d19cde10f9af720ed934eb&dn=South.Park.S20E08.WEBRip.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (311, 311, 229, u'251.67 MiB', u'South.Park.S20E08.1080p.HDTV.x264[state]', u'ThePirateBay::magnet:?xt=urn:btih:a5fa25dfccfa43723e34466b47fed2f89dd34072&dn=South.Park.S20E08.1080p.HDTV.x264%5Bstate%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (272, 272, 51, '6.08 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DL (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9, \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-10-seriya-1-iz-10-t111662.html?id=602710', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (237, 237, 6, u'367.96 MiB', u'South.Park.S20E03.720p.HDTV.x264-AVS[rarbg]', u'ThePirateBay::magnet:?xt=urn:btih:a6fd5218db8b5445981ce1466a501ae1e72fc538&dn=South.Park.S20E03.720p.HDTV.x264-AVS%5Brarbg%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (206, 206, 127, '4.1 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) (L0cDoG)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-8-seriya-iz-10-south-park-t141746.html?id=725943', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (168, 168, 3, u'184.19 MiB', u'South.Park.S20E08.Members.Only.720p.WEBRip.AAC2.0.H.264.mkv', u'ThePirateBay::magnet:?xt=urn:btih:0647e29a5a9b96f91f97f73bb010e8eb9aca66b7&dn=South.Park.S20E08.Members.Only.720p.WEBRip.AAC2.0.H.264.mkv&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (154, 154, 62, '6.51 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-5-seriya-iz-10-south-park-t137088.html?id=727333', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (154, 154, 87, '3.33 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) (L0cDoG)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-8-seriya-iz-10-south-park-t141747.html?id=725945', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (140, 140, 5, u'81.54 MiB', u'South Park S20E08 720p Uncensored Web-DL EN-Sub x264-[MULVAcoded', u'ThePirateBay::magnet:?xt=urn:btih:2491997192df91dd3581db848f0c998d90b1ea09&dn=South+Park+S20E08+720p+Uncensored+Web-DL+EN-Sub+x264-%5BMULVAcoded&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (135, 135, 44, '2.13 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-5-seriya-iz-10-south-park-t137089.html?id=727335', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (118, 118, 12, u'1.38 GiB', u'South.Park.Season.17.Complete.UNCENSORED.720p.WEB-DL.x264.AAC', u'ThePirateBay::magnet:?xt=urn:btih:e92aa604285e189749bb2ce7d5e90e2dca726192&dn=South.Park.Season.17.Complete.UNCENSORED.720p.WEB-DL.x264.AAC&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (116, 116, 2, u'843.03 MiB', u'South.Park.S20E06.Fort.Collins.UNCENSORED.1080p.WEB-DL.H.264-YFN', u'ThePirateBay::magnet:?xt=urn:btih:1c4f30359538f253efc5a292101abb8520406131&dn=South.Park.S20E06.Fort.Collins.UNCENSORED.1080p.WEB-DL.H.264-YFN&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (113, 113, 226, '90.71 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 1-19 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-267 \xd0\xb8\xd0\xb7 267) [1997-2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEBDLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - "Paramount Comedy" ex-MTV]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-18-seriya-1-iz-10-t112158.html?id=771968', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (112, 56, 22, '2,21 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2016) HDTVRip (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-8 \xd0\xb8\xd0\xb7 10) L0cDoG (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=887776&1064662', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (109, 109, 2, u'348.34 MiB', u'South Park 20x07 (720p-HDTV-x264-AVS)[VTV]', u'ThePirateBay::magnet:?xt=urn:btih:06cae396d7276a2e81fe4bd9ca251d59559f2de1&dn=South+Park+20x07+%28720p-HDTV-x264-AVS%29%5BVTV%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (104, 104, 2, u'198.98 MiB', u'South park Season 20 Episode 2', u'ThePirateBay::magnet:?xt=urn:btih:89da24875fd84560a7603baa43e6dc92f6fd4b2a&dn=South+park+Season+20+Episode+2&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (102, 102, 2, u'838.68 MiB', u'South.Park.S20E04.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN', u'ThePirateBay::magnet:?xt=urn:btih:f85c28858b7609c4590294d21ead0330bdd18bb8&dn=South.Park.S20E04.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (100, 50, 9, '6,49 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2016) HDTV [H.264/1080p] (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-7 \xd0\xb8\xd0\xb7 10) Jaskier (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=883108&1058210', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (100, 100, 3, u'840.48 MiB', u'South.Park.S20E05.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN', u'ThePirateBay::magnet:?xt=urn:btih:88c67280085a2f75e4cc0c79968735d33eb901cb&dn=South.Park.S20E05.UNCENSORED.1080p.WEB-DL.AAC2.0.H.264-YFN&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), (92, 46, 1, '7,91 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2015) WEB-DL [H.264/720p] (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 01-10 \xd0\xb8\xd0\xb7 10)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=798266&940469', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (79, 79, 90, '2.3 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-20-sezon-1-2-seriya-iz-10-south-park-t163180.html?id=833923', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (79, 79, 132, '5.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (IdeaFilm)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-20-sezon-1-2-seriya-iz-10-south-park-t163179.html?id=833921', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (55, 55, 100, '6.49 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip (1080p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Jaskier)]', 'RiperAM::http://riperam.orghttp://riperam.org/zar-multseriali/ujniy-park-20-sezon-1-8-seriya-iz-10-south-park-t165730.html?id=834562', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (51, 51, 11, '1.56 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477787', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (48, 24, 9, '56,1 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (1997-2014) DVDRip/WebDL (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd0\xbe\xd0\xb2 + \xd1\x81\xd0\xb0\xd0\xbc\xd1\x8b\xd0\xb5 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb2\xd1\x8b\xd0\xb5 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 + \xd0\xbf\xd0\xbe\xd0\xbb\xd0\xbd\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x84\xd0\xb8\xd0\xbb\xd1\x8c\xd0\xbc)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=625124&191859', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (48, 24, 0, '2,57 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South park (2014) HDRip [\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18, 10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb9 \xd0\xb8\xd0\xb7 10] (Paramount comedy)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=734132&852853', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (46, 46, 31, '5.95 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 13 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14 \xd0\xb8\xd0\xb7 14) (\xd0\xa2\xd1\x80\xd0\xb5\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba\xd0\xb5\xd1\x80, \xd0\x9c\xd1\x8d\xd1\x82\xd1\x82 \xd0\xa1\xd1\x82\xd0\xbe\xd1\x83\xd0\xbd) [2009, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, BDRip] \xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xbf\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 (MTV) + \xd0\x9e\xd1\x80\xd0\xb8\xd0\xb3\xd0\xb8\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xb4\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb6\xd0\xba\xd0\xb0 + \xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xbf\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 (V\xd0\xbe-production) + \xd0\x9e\xd1\x80\xd0\xb8\xd0\xb3\xd0\xb8\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xb0\xd1\x8f \xd0\xb4\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb6\xd0\xba', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/south-park-c-13-1-14-14-mtv-v-production-t22400.html?id=25896', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (44, 22, 22, '5,01 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2016) (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 20, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-8 \xd0\xb8\xd0\xb7 10) HDTVRip [H.264/720p-LQ] (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=894777&1073915', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (44, 44, 148, '3.36 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2016, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Jaskier)]', 'RiperAM::http://riperam.orghttp://riperam.org/zar-multseriali/ujniy-park-20-sezon-1-8-seriya-iz-10-south-park-t165731.html?id=834794', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (42, 21, 1, '2,63 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2015) WEB-DLRip (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 01-10 \xd0\xb8\xd0\xb7 10) [DVO \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=798225&940413', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (39, 39, 34, '4.67 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477518', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (34, 34, 35, '5.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-7 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x94 (Paramount Comedy) / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1479186', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (30, 30, 6, '2 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9, \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-10-seriya-1-iz-10-t111661.html?id=602030', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (27, 27, 6, '9.47 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / 2 x \xd0\x9f\xd0\x94, 2 x \xd0\x9f\xd0\x9c, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1385080', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (26, 13, 1, '4,27 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2015) HDTVRip [H.264/720p-LQ] (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 01-10 \xd0\xb8\xd0\xb7 10) Jaskier', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=815441&964692', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (22, 22, 24, '90.71 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park / 1997-2015 / \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=484607', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (20, 10, 0, '5,62 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (2013) WEB-DL [H.264/720p-LQ] (17 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-10 \xd0\xb8\xd0\xb7 10) (\xd0\x9e\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x8f) [18+]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=616639&706224', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (19, 19, 0, '2.81 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1377091', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (18, 9, 0, '2,59 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South park (2013) HDRip [\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 17, 10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb9 \xd0\xb8\xd0\xb7 10] (Comedy central)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=728154&845636', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (18, 18, 12, '600 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 7-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8) / South Park / 2016 / \xd0\x9f\xd0\x94 (SunshineStudio) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1492411', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (17, 17, 0, '1.08 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba: \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xb8 \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\x93\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xbd) / South Park: Bigger, Longer & Uncut / 1999 / \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2) / HDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=848584', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (14, 7, 1, '2,96 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) WEB-DLRip (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14) (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=509439&483626', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (14, 14, 3, '2.71 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 15 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14) [2011, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x90\xd0\xbd\xd0\xb8\xd0\xbc\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, WEB-DLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-15-seriya-1-14-t43885.html?id=168699', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (12, 12, 1, '2.61 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6, 8-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x9c (Paramount Comedy), \xd0\xa1\xd0\xa2 / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1378559', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (12, 12, 16, '1.66 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9b\xd0\x9e (L0cDoG) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477158', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (12, 12, 29, '4.72 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (Coldfilm) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1476989', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (11, 11, 0, '2.17 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (17 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2013 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1128747', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (11, 11, 1, '2 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256710', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (10, 5, 0, '19,1 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut (1999) BDRemux [1080p]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=606749&694448', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (10, 10, 0, '6.72 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1377313', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 0, '7.2 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / 2 x \xd0\x9f\xd0\x94, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256573', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 11, '114.84 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (2-18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 14-257 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 257) / South Park / 1998-2014 / \xd0\x9f\xd0\x9c, 5 x \xd0\x9f\xd0\x94, \xd0\x9f\xd0\x9e, \xd0\x90\xd0\x9f, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1121230', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 1, '6.08 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256771', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 3, '7.91 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / 2 x \xd0\x9f\xd0\x94, 2 x \xd0\x9f\xd0\x9c, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1384013', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 0, '8.18 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut / 1999 / \xd0\x9f\xd0\x9c, 3 x \xd0\x90\xd0\x9f, \xd0\xa1\xd0\xa2 / BDRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1198585', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (9, 9, 0, '412 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9b\xd0\x9e (L0cDoG) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1476939', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 4, 0, '2,38 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 2 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 2 season (1998) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=9947&10798', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (8, 4, 0, '2,57 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 3 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 3 season (1999) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=10082&10944', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (8, 4, 0, '7,48 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (15 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14) (2011) [H.264/720p-LQ] WEB-DL', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=525722&594572', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (8, 8, 7, '48.9 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-11 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park / 1997-2007 / \xd0\x9f\xd0\x9c / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=368930', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 8, 4, '6.92 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba (1-2 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park / 1997-1998 / \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2) / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=672637', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 8, 15, '2.3 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (IdeaFilm) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477174', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (8, 8, 2, '8.28 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1377153', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (7, 7, 0, '4.61 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 19, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8: 1-6, 8 \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DL (720p), \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Paramount Comedy)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-sezon-19-serii-1-6-8-iz-10-south-park-t137916.html?id=721091', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (7, 7, 45, '5.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (IdeaFilm) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477176', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (7, 7, 0, '1.37 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba: \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xb8 \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger, Longer & Uncut / 1999 / \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2) / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=371714', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (6, 3, 0, '2,03 GB', 'South Park /\xd0\xa1\xd0\xb0\xd1\x83\xd1\x82-\xd0\x9f\xd0\xb0\xd1\x80\xd0\xba 9 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd MTV', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=5373&6079', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 0, '694 MB', '\xd0\xa1\xd0\xb0\xd1\x83\xd1\x82 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut (1999) DVDrip (\xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 \xd0\x93\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xb0)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=5835&6569', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 0, '87,6 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba \xd0\x9a\xd0\xbe\xd0\xbb\xd0\xbb\xd0\xb5\xd0\xba\xd1\x86\xd0\xb8\xd1\x8f / South Park Collection (1997-2010) DVDRip, BDRip, WebDL (1-13 \xd0\xb8 14 (1-7 \xd1\x8d\xd0\xbf.) c\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=245759&260814', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 0, '2,71 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 15 \xd0\xbf\xd0\xbe\xd0\xbb\xd0\xbd\xd1\x8b\xd0\xb9 (14)) (2011) HDTVRip (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=303178&330978', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 3, 1, '7,39 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5 WEB-DLRip (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 (14)) [720p]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=510810&486782', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (6, 6, 3, '2.53 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-9 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9)=\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\x9a\xd1\x83\xd0\xb1\xd0\xb5=]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-19-sezon-1-4-seriya-iz-10-south-park-t139331.html?id=724547', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (6, 6, 23, '4.31 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-7 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / 3 x \xd0\x9f\xd0\x9c, 2 x \xd0\x9f\xd0\x94, 2 x \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477387', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (6, 6, 4, '560 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 7-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8) / South Park / 2016 / \xd0\x9f\xd0\x94 (SunshineStudio) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1492410', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 0, '2.76 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9f\xd0\x94 (Paramount Comedy) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1274229', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 6, '4.92 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (Jaskier), \xd0\xa1\xd0\xa2 / HDTVRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477358', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 15, '1.19 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-8 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8) / South Park / 2016 / \xd0\x9f\xd0\x9c (Coldfilm) / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1476986', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 4, '2.54 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-6 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2016 / \xd0\x9f\xd0\x9c (Jaskier), \xd0\xa1\xd0\xa2 / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1477462', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (5, 5, 9, '61.48 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-20 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b: 1-273 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 277) / South Park / 1997-2016 / \xd0\x9f\xd0\x9c (Paramount Comedy ex MTV) / HEVC / WEB-DLRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1482039', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 2, 0, '2,51 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 8 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 8 season (2004) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=9410&10281', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '2,82 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba. 4 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd/ South Park. 4 season (2000) TVRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=10086&10948', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '4,3 GB', 'South Park: Bigger Longer & Uncut / \xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbf\xd0\xbe\xd0\xbb\xd0\xbd\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd1\x84\xd0\xb8\xd0\xbb\xd1\x8c\xd0\xbc, \xd0\x93\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xbd) DVD-5', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=42538&43366', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '44,2 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\x92\xd1\x81\xd0\xb5 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x8b) / South Park DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=62239&63500', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '3,57 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\xb4\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 / South Park: Bigger Longer & Uncut (1999) [720p] BDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=150728&152983', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '7,32 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14) / South Park (2012) WEB-DLRip [H.264/720p-LQ]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=510462&558155', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '8,23 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) WEB-DL [H.264/720p-LQ] (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd, \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 1-14 \xd0\xb8\xd0\xb7 14)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=532312&594562', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 2, 0, '11,9 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (2012) WEB-DLRip [H.264/1080p-LQ] (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16 / \xd0\xad\xd0\xbf\xd0\xb8\xd0\xb7\xd0\xbe\xd0\xb4 1-14 \xd0\xb8\xd0\xb7 14)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=528308&597806', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (4, 4, 0, '3.43 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (17 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb9 \xd0\xb8\xd0\xb7 10) / South Park / 2013 / \xd0\x9f\xd0\x94 (Paramount Comedy) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1155833', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '2.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\xba\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1024129', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '11.86 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / 2 x \xd0\x9f\xd0\x94, \xd0\x9f\xd0\x9c, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1050214', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '2.68 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / \xd0\x9f\xd0\x94 (Paramount Comedy) / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1050218', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (4, 4, 0, '4.1 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9b\xd0\x9e (L0cDoG) / HDTVRip (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1380757', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 7, '2.31 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 19, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8: 1-6, 8-9 \xd0\xb8\xd0\xb7 10) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Paramount Comedy)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-sezon-19-serii-1-6-8-9-iz-10-south-park-t137915.html?id=726250', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (3, 3, 1, '2.27 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, HDTVRip, \xd0\x9b\xd1\x8e\xd0\xb1\xd0\xb8\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9) - L0cDoG]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-18-seriya-1-t111466.html?id=599823', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (3, 3, 0, '7.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (16 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2012 / \xd0\x9f\xd0\x94 (\xd0\x9a\xd1\x83\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb2 \xd0\xba\xd1\x83\xd0\xb1\xd0\xb5) / WEB-DL (720p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1030433', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 9, '174.76 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (3-18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 32-257 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 257) / South Park / 1999-2014 / \xd0\x9f\xd0\x9c, 4 x \xd0\x9f\xd0\x94, \xd0\x9f\xd0\x9e, \xd0\x9b\xd0\x9e, \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1132433', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 0, '2.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (18 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2014 / \xd0\x9b\xd0\x9e, \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / WEB-DLRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1256768', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 2, '28.6 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (1-2 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-31 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 31) / South Park / 1997-1998 / 3 x \xd0\x9f\xd0\x94, \xd0\x90\xd0\x9f (\xd0\x9f\xd1\x83\xd1\x87\xd0\xba\xd0\xbe\xd0\xb2), \xd0\xa1\xd0\xa2 / WEB-DL (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1330595', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (3, 3, 0, '2.85 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (19 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-10 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 10) / South Park / 2015 / \xd0\x9b\xd0\x9e (L0cDoG), \xd0\xa1\xd0\xa2 / HDTVRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1376594', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 1, 0, '2,32 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba \xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 10 / South Park Season 10 MTV!(2006)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=33856&34674', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '3,42 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: 11 \xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd.(MTV) / South Park 11 Season Complete (2007) [SAT-Rip]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=76759&77067', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '700 MB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba \xd0\x92\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbb\xd1\x8f\xd0\xbd\xd0\xb4\xd0\xb8\xd1\x8f / South Park Imaginationland (2008) DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=114379&115419', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '8,81 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (1997-2008 \xd0\xb3\xd0\xb3.) 11 \xd0\xa1\xd0\x95\xd0\x97\xd0\x9e\xd0\x9d\xd0\x9e\xd0\x92 [DVDRip]', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=119670&120391', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 1, '714 MB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba 12 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd / South Park 12 season (2008) DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=133111&133059', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '918 MB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba 13 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd / South Park 13 season (2009)', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=131974&133062', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 1, 0, '41 GB', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba 13 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd\xd0\xbe\xd0\xb2 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 MTV + \xd0\x91\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xbe\xd0\xb9, \xd0\x94\xd0\xbb\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xb8 \xd0\x9d\xd0\xb5\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9 + \xd0\x92\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbb\xd1\x8f\xd0\xbd\xd0\xb4\xd0\xb8\xd1\x8f (1992-2009) + \xd0\xbc\xd1\x83\xd0\xb7\xd1\x8b\xd0\xba\xd0\xb0 / South Park (1992-2009) DVDRip', 'NNMClubRu::http://nnmclub.to/forum/download.php?id=180268&185413', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.NNMClubRu\\icon.png'), (2, 2, 0, '1.45 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba: \xd0\x92\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb6\xd0\xbb\xd1\x8f\xd0\xbd\xd0\xb4\xd0\xb8\xd1\x8f / South Park: Imaginationland / 2008 / \xd0\x9f\xd0\x9c / DVDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=547097', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 2, 1, '16.54 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (15 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2011 / \xd0\x9f\xd0\x9c, 2 x \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / BDRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=999727', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 2, 0, '5.39 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (15 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2011 / 2 x \xd0\x9f\xd0\x9c, \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / HDRip', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1000191', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (2, 2, 0, '14.49 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (14 \xd1\x81\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 1-14 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb8\xd0\xb7 14) / South Park / 2010 / \xd0\x9f\xd0\x9c, 2 x \xd0\x9f\xd0\x94, \xd0\xa1\xd0\xa2 / BDRip (1080p)', 'KinoZalTV::http://kinozal-tv.appspot.com/download.php?id=1127883', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.KinoZalTV\\icon.png'), (0, 0, 0, '33.24 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 01-19 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-266) [1997-2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, BDRip1080p, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xb4\xd0\xb2\xd1\x83\xd1\x85\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) - MTV]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-01-19-seriya-1-266-t163989.html?id=818401', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '349.73 \xd0\x9c\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba (\xd0\xa1\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 19, \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f: 7) / South Park [2015, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip, \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9 (Paramount Comedy)]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-sezon-19-seriya-7-south-park-t143571.html?id=726424', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 1, '3.78 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 18 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-10 \xd0\xb8\xd0\xb7 10) [2014, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, \xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DL (720p), \xd0\x9b\xd1\x8e\xd0\xb1\xd0\xb8\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 (\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9) - L0cDoG]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-18-seriya-1-t111655.html?id=600621', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '5.35 \xd0\x93\xd0\x91', '[PC] South Park: The Stick of Truth + 1 DLC / South Park: \xd0\x9f\xd0\xb0\xd0\xbb\xd0\xba\xd0\xb0 \xd0\x98\xd1\x81\xd1\x82\xd0\xb8\xd0\xbd\xd1\x8b [RPG] [\xd0\x9b\xd0\xb8\xd1\x86\xd0\xb5\xd0\xbd\xd0\xb7\xd0\xb8\xd1\x8f] [\xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb0\xd0\xbd\xd0\xb3\xd0\xbb\xd0\xb8\xd0\xb9\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd1\x84\xd1\x80\xd0\xb0\xd0\xbd\xd1\x86\xd1\x83\xd0\xb7\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb8\xd1\x82\xd0\xb0\xd0\xbb\xd1\x8c\xd1\x8f\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xbd\xd0\xb5\xd0\xbc\xd0\xb5\xd1\x86\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb8\xd1\x81\xd0\xbf\xd0\xb0\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb1\xd1\x80\xd0\xb0\xd0\xb7\xd0\xb8\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xbf\xd0\xbe\xd1\x80\xd1\x82\xd1\x83\xd0\xb3\xd0\xb0\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 / ENG] (2014)', 'RiperAM::http://riperam.orghttp://riperam.org/hot-games/south-park-the-stick-of-truth-1-dlc-south-park-palka-istini-2014-t98200.html?id=475637', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '3.9 \xd0\x93\xd0\x91', '[PC] South Park: The Stick of Truth + 1 DLC / South Park: \xd0\x9f\xd0\xb0\xd0\xbb\xd0\xba\xd0\xb0 \xd0\x98\xd1\x81\xd1\x82\xd0\xb8\xd0\xbd\xd1\x8b [RPG] [RePack \xd0\xbe\xd1\x82 R.G. Element Arts] [\xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9, \xd0\xb0\xd0\xbd\xd0\xb3\xd0\xbb\xd0\xb8\xd0\xb9\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 / ENG] (2014)', 'RiperAM::http://riperam.orghttp://riperam.org/hot-repack-games/south-park-the-stick-of-truth-1-dlc-south-park-palka-istini-2014-t98201.html?id=475645', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '2.17 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 17 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f: 1-10 \xd0\xb8\xd0\xb7 10) [2013, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-17-seriya-1-iz-10-t86496.html?id=473330', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '3.43 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd: 17 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb8: 1-10 \xd0\xb8\xd0\xb7 10) [2013, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-17-seriya-1-iz-10-t86160.html?id=448987', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '2.96 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 16 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14 \xd0\xb8\xd0\xb7 14) [2012, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEBDLRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-16-seriya-1-8-iz-14-t56766.html?id=266561', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '38.16 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 1-10 \xd0\xb8\xd0\xb7 16 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-153 \xd0\xb8\xd0\xb7 153) [1997-2007, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, DVDRip]', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/ujniy-park-south-park-cezon-1-10-iz-16-seriya-1-153-iz-153-t56116.html?id=236508', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png'), (0, 0, 0, '2.83 \xd0\x93\xd0\x91', '\xd0\xae\xd0\xb6\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xba / South Park (C\xd0\xb5\xd0\xb7\xd0\xbe\xd0\xbd 14 , \xd0\xa1\xd0\xb5\xd1\x80\xd0\xb8\xd1\x8f 1-14 \xd0\xb8\xd0\xb7 14) (\xd0\xa2\xd1\x80\xd0\xb5\xd0\xb9 \xd0\x9f\xd0\xb0\xd1\x80\xd0\xba\xd0\xb5\xd1\x80, \xd0\x9c\xd1\x8d\xd1\x82\xd1\x82 \xd0\xa1\xd1\x82\xd0\xbe\xd1\x83\xd0\xbd) [2011, \xd0\x9c\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x81\xd0\xb5\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbb, \xd0\x9a\xd0\xbe\xd0\xbc\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f, WEB-DLRip] \xd0\x9f\xd1\x80\xd0\xbe\xd1\x84\xd0\xb5\xd1\x81\xd1\x81\xd0\xb8\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd1\x8b\xd0\xb9 (\xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8b\xd0\xb9, \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd1\x8b\xd0\xb9) VO-Production', 'RiperAM::http://riperam.orghttp://riperam.org/foreign-multserials/south-park-c-14-1-14-14-vo-production-t22103.html?id=25606', 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.RiperAM\\icon.png')] - ''' \ No newline at end of file + #because underlying xbmcgui classes are not grabage-collected. \ No newline at end of file From 66bc7eb781a28e429d626154941afd91a917f6b2 Mon Sep 17 00:00:00 2001 From: kolosovski Date: Sun, 27 Nov 2016 22:07:07 +0200 Subject: [PATCH 029/126] Kodi crash on launching play a file inside .torrent file torrenter didn't refresh "lastTorrent" and "lastTorrentUrl" settings after opening a torrent file. Due to this, after choosing a file to play inside torrent file, kodi restarted, because it couldn't play a file with index we have just chosen in a torrent file it remembered last time these settings were saved. --- Core.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Core.py b/Core.py index f9a16dd..e4a2a7e 100644 --- a/Core.py +++ b/Core.py @@ -1379,6 +1379,9 @@ class Core: if not url: action = xbmcgui.Dialog() url = action.browse(1, self.localize('Choose .torrent in video library'), 'video', '.torrent') + torrent = Downloader.Torrent(self.userStorageDirectory, torrentFilesDirectory=self.torrentFilesDirectory) + self.__settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) + self.__settings__.setSetting("lastTorrentUrl", url) if url: xbmc.executebuiltin( 'XBMC.ActivateWindow(%s)' % 'Videos,plugin://plugin.video.torrenter/?action=%s&url=%s' From 6f7e0548a868f1a268b949b11e3431dc18630c2f Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sun, 27 Nov 2016 23:44:48 +0300 Subject: [PATCH 030/126] choose hash auto --- Core.py | 38 +++++++++++++++++++++++++++++--------- functions.py | 5 +++++ 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Core.py b/Core.py index f9a16dd..ed3a84c 100644 --- a/Core.py +++ b/Core.py @@ -1793,11 +1793,15 @@ class Core: f = open(url, 'rb') torrent = f.read() f.close() + from python_libtorrent import get_libtorrent + libtorrent = get_libtorrent() + info = libtorrent.torrent_info(libtorrent.bdecode(torrent)) + name = info.name() success = Download().add(torrent, dirname) if success: showMessage(self.localize('Torrent-client Browser'), self.localize('Added!'), forced=True) if ind: - id = self.chooseHASH(Download().list())[0] + id = self.chooseHASH(Download().list(), name)[0] Download().setprio(id, ind) def downloadLibtorrent(self, params={}): @@ -1877,7 +1881,7 @@ class Core: else: self.openSection(params) - def chooseHASH(self, list): + def chooseHASH(self, list, name = None): dialog_items, dialog_items_clean = [], [] dialog_files = [] dat = list @@ -1887,14 +1891,30 @@ class Core: for data in dat: dialog_files.append((data['id'], data['dir'].encode('utf-8'))) dialog_items.append('[' + str(data['progress']) + '%] ' + data['name']) - if len(dialog_items) > 1: - ret = xbmcgui.Dialog().select(self.localize('Choose in torrent-client:'), dialog_items) - if ret > -1 and ret < len(dialog_files): - hash = dialog_files[ret] + dialog_items_clean.append(data['name']) + + + log('[chooseHASH]: name %s ' % str(name)) + for data in dat: + # Debug('[chooseHASH]: '+str((data['name'], data['id'], data['dir'].encode('utf-8')))) + dialog_files.append((data['id'], data['dir'].encode('utf-8'))) + dialog_items.append('[' + str(data['progress']) + '%] ' + data['name']) + dialog_items_clean.append(data['name']) + + if name: + if decode_str(name) in dialog_items_clean: + return dialog_files[dialog_items_clean.index(decode_str(name))] + elif name in dialog_items_clean: + return dialog_files[dialog_items_clean.index(name)] + else: + if len(dialog_items) > 1: + ret = xbmcgui.Dialog().select(self.localize('Choose in torrent-client:'), dialog_items) + if ret > -1 and ret < len(dialog_files): + hash = dialog_files[ret] + return hash + elif len(dialog_items) == 1: + hash = dialog_files[0] return hash - elif len(dialog_items) == 1: - hash = dialog_files[0] - return hash def localize(self, string): try: diff --git a/functions.py b/functions.py index 4bd2972..317554b 100644 --- a/functions.py +++ b/functions.py @@ -2147,6 +2147,11 @@ def encode_msg(msg): msg = ensure_str(msg) return msg +def decode_str(string, encoding='utf-8'): + if not isinstance(string, unicode): + string = string.decode(encoding) + return string + def get_platform(): ret = { "arch": sys.maxsize > 2 ** 32 and "x64" or "x86", From 85c27690ad0a090a80d3ab5f58947bff3fe800fd Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sun, 27 Nov 2016 23:45:05 +0300 Subject: [PATCH 031/126] window update --- searchwindow.py | 66 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index de653c8..38484ac 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -34,6 +34,9 @@ __root__ = __settings__.getAddonInfo('path') log('SYS ARGV: ' + str(sys.argv)) +#https://github.com/xbmc/xbmc/blob/8d4a5bba55638dfd0bdc5e7de34f3e5293f99933/xbmc/input/Key.h +ACTION_STOP = 13 +ACTION_PLAYER_PLAY = 79 class MultiChoiceDialog(pyxbmct.AddonDialogWindow): __settings__ = sys.modules["__main__"].__settings__ @@ -48,7 +51,6 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): def __init__(self, title=""): super(MultiChoiceDialog, self).__init__(title) self.setGeometry(1280, 720, 9, 16) - self.selected = [] self.set_controls() self.connect_controls() self.set_navigation() @@ -63,27 +65,30 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): self.placeControl(self.button_search, 0, 5, 1, 2) self.button_history = pyxbmct.Button("History") self.placeControl(self.button_history, 0, 7, 1, 2) + self.button_controlcenter = pyxbmct.Button("Control\r\nCenter") + self.placeControl(self.button_controlcenter, 0, 9, 1, 2) self.right_menu() self.listing = pyxbmct.List(_imageWidth=40, _imageHeight=40, _itemTextXOffset=10, _itemTextYOffset=2, _itemHeight=40, _space=2, _alignmentY=4) self.placeControl(self.listing, 1, 0, 8, 14) - def connect_controls(self): - self.connect(self.listing, self.press) + self.connect(self.listing, self.right_press1) self.connect(self.button_history, self.history) self.connect(self.button_search, self.search) + self.connect(self.button_controlcenter, self.controlCenter) #self.connectEventList([ACTION_ENTER], self.search) def set_navigation(self): #Top menu self.input_search.setNavigation(self.listing, self.listing, self.button_right1, self.button_search) self.button_search.setNavigation(self.listing, self.listing, self.input_search, self.button_history) - self.button_history.setNavigation(self.listing, self.listing, self.button_search, self.button_right1) + self.button_history.setNavigation(self.listing, self.listing, self.button_search, self.button_controlcenter) + self.button_controlcenter.setNavigation(self.listing, self.listing, self.button_history, self.button_right1) #Listing self.listing.setNavigation(self.input_search, self.input_search, self.input_search, self.button_right1) #Right menu - self.button_right1.setNavigation(self.button_history, self.button_right2, self.listing, self.input_search) + self.button_right1.setNavigation(self.button_controlcenter, self.button_right2, self.listing, self.input_search) self.button_right2.setNavigation(self.button_right1, self.button_right3, self.listing, self.input_search) self.button_right3.setNavigation(self.button_right2, self.button_right4, self.listing, self.input_search) self.button_right4.setNavigation(self.button_right3, self.button_right5, self.listing, self.input_search) @@ -95,8 +100,6 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): else: self.setFocus(self.input_search) - - def setAnimation(self, control): # Set fade animation for all add-on window controls control.setAnimations([('WindowOpen', 'effect=fade start=0 end=100 time=500',), @@ -126,9 +129,10 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): #log(title) self.drawItem(title, 'search_item', link, image) - def press(self): + def right_press1(self): item = self.listing.getSelectedItem() params = json.loads(item.getLabel2()) + log('right_press1 params: ' + str(params)) mode = params.get('mode') filename = item.getfilename() label = item.getLabel() @@ -142,12 +146,35 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): self.last_action() elif mode == 'torrent_play': action = 'playTorrent' - log('params: '+str(params)) url = self.form_link(action, params) log('url: '+url) xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) self.close() + def right_press2(self): + item = self.listing.getSelectedItem() + params = json.loads(item.getLabel2()) + log('right_press2 params: ' + str(params)) + mode = params.get('mode') + if mode == 'torrent_play': + action = 'downloadFilesList' + link = {'ind': str(params.get('url'))} + url = self.form_link(action, link) + log('url: ' + url) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + + def right_press3(self): + item = self.listing.getSelectedItem() + params = json.loads(item.getLabel2()) + log('right_press3 params: ' + str(params)) + mode = params.get('mode') + if mode == 'torrent_play': + action = 'downloadLibtorrent' + link = {'ind': str(params.get('url'))} + url = self.form_link(action, link) + log('url: ' + url) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + def open_torrent(self, link, tdir = None): #cache if link != self.last_link: @@ -194,20 +221,25 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): self.button_right4 = pyxbmct.Button("Empty") self.button_right5 = pyxbmct.Button("Empty") self.button_right6 = pyxbmct.Button("Empty") + self.connect(self.button_right1, self.right_press1) + self.connect(self.button_right2, self.right_press2) + self.connect(self.button_right3, self.right_press3) + #self.connect(self.button_right4, self.right_press2) + #self.connect(self.button_right5, self.right_press2) + #self.connect(self.button_right6, self.right_press2) elif mode == 'search': self.right_buttons_count = 3 self.button_right1.setLabel("Open") - self.connect(self.button_right1, self.press) - self.connect(self.button_right1, self.press) - self.button_right2.setLabel("Open2") - self.button_right3.setLabel("Open3") + self.connect(self.button_right1, self.right_press1) + self.button_right2.setLabel(self.localize('Download via T-client')) + self.connect(self.button_right2, self.right_press2) + self.button_right3.setLabel(self.localize('Download via Libtorrent')) + self.connect(self.button_right3, self.right_press3) elif mode == 'history': self.right_buttons_count = 5 self.button_right1.setLabel("Search") - self.connect(self.button_right1, self.history_search) - self.connect(self.button_right1, self.history_search) self.button_right2.setLabel("Open2") self.button_right3.setLabel("Open3") self.button_right4.setLabel("Open2") @@ -249,6 +281,10 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): return url + def controlCenter(self): + xbmc.executebuiltin( + 'xbmc.RunScript(%s,)' % os.path.join(__root__, 'controlcenter.py')) + def log(msg): try: xbmc.log("### [%s]: %s" % (__plugin__,msg,), level=xbmc.LOGNOTICE ) From 8de3834c1c9e65c148022c7fd5bca4e1c5f3ffb0 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Mon, 28 Nov 2016 20:22:50 +0300 Subject: [PATCH 032/126] navigation update --- changelog.txt | 3 ++ searchwindow.py | 129 ++++++++++++++++++++++++++++++------------------ 2 files changed, 83 insertions(+), 49 deletions(-) diff --git a/changelog.txt b/changelog.txt index 8b93823..a757435 100644 --- a/changelog.txt +++ b/changelog.txt @@ -2,6 +2,9 @@ [B]Version 2.5.5[/B] [+] Control Center: Исправлена работа выбора трекеров для определенного запроса +[+] Торрент-клиент: При скачивании одного файла торрент-клиентом теперь автоматически выбирается раздача +[+] .torrent Player: Исправлена работа (спасибо kolosovski) +[+] Окно Поиска: Добавлено Окно Поиска в режиме тестирования [B]Version 2.5.4[/B] [+] Исправлено "открыть без возврата". Спасибо viorel-m. diff --git a/searchwindow.py b/searchwindow.py index 38484ac..52f8da0 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -38,7 +38,7 @@ log('SYS ARGV: ' + str(sys.argv)) ACTION_STOP = 13 ACTION_PLAYER_PLAY = 79 -class MultiChoiceDialog(pyxbmct.AddonDialogWindow): +class SearchWindow(pyxbmct.AddonDialogWindow): __settings__ = sys.modules["__main__"].__settings__ fileList = [] contentList = [] @@ -47,9 +47,11 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): last_link = None last_query = None last_action = None + last_top_button = None + last_right_button = None def __init__(self, title=""): - super(MultiChoiceDialog, self).__init__(title) + super(SearchWindow, self).__init__(title) self.setGeometry(1280, 720, 9, 16) self.set_controls() self.connect_controls() @@ -67,33 +69,26 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): self.placeControl(self.button_history, 0, 7, 1, 2) self.button_controlcenter = pyxbmct.Button("Control\r\nCenter") self.placeControl(self.button_controlcenter, 0, 9, 1, 2) - self.right_menu() self.listing = pyxbmct.List(_imageWidth=40, _imageHeight=40, _itemTextXOffset=10, _itemTextYOffset=2, _itemHeight=40, _space=2, _alignmentY=4) self.placeControl(self.listing, 1, 0, 8, 14) + self.right_menu() + def connect_controls(self): self.connect(self.listing, self.right_press1) self.connect(self.button_history, self.history) self.connect(self.button_search, self.search) self.connect(self.button_controlcenter, self.controlCenter) - #self.connectEventList([ACTION_ENTER], self.search) def set_navigation(self): #Top menu - self.input_search.setNavigation(self.listing, self.listing, self.button_right1, self.button_search) + self.input_search.setNavigation(self.listing, self.listing, self.last_right_button, self.button_search) self.button_search.setNavigation(self.listing, self.listing, self.input_search, self.button_history) self.button_history.setNavigation(self.listing, self.listing, self.button_search, self.button_controlcenter) - self.button_controlcenter.setNavigation(self.listing, self.listing, self.button_history, self.button_right1) + self.button_controlcenter.setNavigation(self.listing, self.listing, self.button_history, self.last_right_button) #Listing - self.listing.setNavigation(self.input_search, self.input_search, self.input_search, self.button_right1) - #Right menu - self.button_right1.setNavigation(self.button_controlcenter, self.button_right2, self.listing, self.input_search) - self.button_right2.setNavigation(self.button_right1, self.button_right3, self.listing, self.input_search) - self.button_right3.setNavigation(self.button_right2, self.button_right4, self.listing, self.input_search) - self.button_right4.setNavigation(self.button_right3, self.button_right5, self.listing, self.input_search) - self.button_right5.setNavigation(self.button_right4, self.button_right6, self.listing, self.input_search) - self.button_right6.setNavigation(self.button_right5, self.button_right1, self.listing, self.input_search) + self.listing.setNavigation(self.input_search, self.input_search, self.input_search, self.last_right_button) if self.listing.size(): self.setFocus(self.listing) @@ -147,7 +142,7 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): elif mode == 'torrent_play': action = 'playTorrent' url = self.form_link(action, params) - log('url: '+url) + log('right_press1 url: '+url) xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) self.close() @@ -156,24 +151,47 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): params = json.loads(item.getLabel2()) log('right_press2 params: ' + str(params)) mode = params.get('mode') + filename = item.getfilename() if mode == 'torrent_play': action = 'downloadFilesList' link = {'ind': str(params.get('url'))} url = self.form_link(action, link) - log('url: ' + url) + log('right_press2 url: ' + url) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + elif mode == 'search_item': + action = 'downloadFilesList' + link = {'url': filename} + url = self.form_link(action, link) + log('right_press2 url: ' + url) xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) def right_press3(self): item = self.listing.getSelectedItem() params = json.loads(item.getLabel2()) log('right_press3 params: ' + str(params)) + filename = item.getfilename() mode = params.get('mode') if mode == 'torrent_play': action = 'downloadLibtorrent' link = {'ind': str(params.get('url'))} url = self.form_link(action, link) - log('url: ' + url) + log('right_press3 url: ' + url) xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + elif mode == 'search_item': + action = 'downloadLibtorrent' + link = {'url': filename} + url = self.form_link(action, link) + log('right_press2 url: ' + url) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + + def right_press4(self): + pass + + def right_press5(self): + pass + + def right_press6(self): + pass def open_torrent(self, link, tdir = None): #cache @@ -211,46 +229,59 @@ class MultiChoiceDialog(pyxbmct.AddonDialogWindow): log('history_search: '+self.listing.getSelectedItem().getLabel()) def right_menu(self, mode='place'): + + log('self.actions_connected: ' + str(self.actions_connected)) + log('self.controls_connected: ' + str(self.controls_connected)) + if not mode == 'place': self.last_right_buttons_count = self.right_buttons_count + remove_list = [getattr(self, "button_right" + str(index)) for index + in range(1, self.last_right_buttons_count+1)] + self.disconnectEventList(remove_list) + self.removeControls(remove_list) + label_list = [] if mode == 'place': - self.button_right1 = pyxbmct.Button("Empty") - self.button_right2 = pyxbmct.Button("Empty") - self.button_right3 = pyxbmct.Button("Empty") - self.button_right4 = pyxbmct.Button("Empty") - self.button_right5 = pyxbmct.Button("Empty") - self.button_right6 = pyxbmct.Button("Empty") - self.connect(self.button_right1, self.right_press1) - self.connect(self.button_right2, self.right_press2) - self.connect(self.button_right3, self.right_press3) - #self.connect(self.button_right4, self.right_press2) - #self.connect(self.button_right5, self.right_press2) - #self.connect(self.button_right6, self.right_press2) + label_list = ["Empty","Empty","Empty","Empty","Empty","Empty"] elif mode == 'search': - self.right_buttons_count = 3 - self.button_right1.setLabel("Open") - self.connect(self.button_right1, self.right_press1) - self.button_right2.setLabel(self.localize('Download via T-client')) - self.connect(self.button_right2, self.right_press2) - self.button_right3.setLabel(self.localize('Download via Libtorrent')) - self.connect(self.button_right3, self.right_press3) + label_list = ["Open", + self.localize('Download via T-client'), + self.localize('Download via Libtorrent')] elif mode == 'history': - self.right_buttons_count = 5 - self.button_right1.setLabel("Search") - self.button_right2.setLabel("Open2") - self.button_right3.setLabel("Open3") - self.button_right4.setLabel("Open2") - self.button_right5.setLabel("Open3") + label_list = ["Search", + "Open2","Open2","Open2","Open2"] - control_list = [self.button_right1, self.button_right2, self.button_right3, self.button_right4, self.button_right5, self.button_right6] - if self.last_right_buttons_count > self.right_buttons_count: - self.removeControls(control_list[self.right_buttons_count:self.last_right_buttons_count]) - elif self.last_right_buttons_count < self.right_buttons_count: - for button in control_list[self.last_right_buttons_count:self.right_buttons_count]: - self.placeControl(button, control_list.index(button)+1, 14, 1, 2) + self.right_buttons_count = len(label_list) + button_num_list = range(1, self.right_buttons_count+1) + + for index in button_num_list: + setattr(self, "button_right" + str(index), pyxbmct.Button(label_list[index - 1])) + button = getattr(self, "button_right" + str(index)) + self.connect(button, getattr(self, "right_press"+str(index))) + self.placeControl(button, index, 14, 1, 2) + + #Navigation + self.last_right_button = self.button_right1 + for index in button_num_list: + button = getattr(self, "button_right" + str(index)) + + if self.right_buttons_count == 1: + button.setNavigation(self.button_controlcenter, self.button_right1, self.listing, self.input_search) + else: + if index == button_num_list[0]: + button.setNavigation(self.button_controlcenter, self.button_right2, self.listing, self.input_search) + elif index == button_num_list[-1]: + button.setNavigation(getattr(self, "button_right" + str(index-1)), self.button_right1, self.listing, + self.input_search) + else: + button.setNavigation(getattr(self, "button_right" + str(index - 1)), + getattr(self, "button_right" + str(index + 1)), + self.listing, + self.input_search) + + self.set_navigation() def localize(self, string): try: @@ -311,7 +342,7 @@ def titleMake(seeds, leechers, size, title): if __name__ == "__main__": - dialog = MultiChoiceDialog("Torrenter Search Window") + dialog = SearchWindow("Torrenter Search Window") dialog.doModal() del dialog #You need to delete your instance when it is no longer needed #because underlying xbmcgui classes are not grabage-collected. \ No newline at end of file From f6eced5d283d7f2a020ac3535d9f18749905ee8c Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Mon, 28 Nov 2016 22:21:22 +0300 Subject: [PATCH 033/126] history update --- searchwindow.py | 105 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 80 insertions(+), 25 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index 52f8da0..f6584fb 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -22,7 +22,7 @@ import sys, os, urllib, json import xbmcaddon import xbmc import xbmcgui -from functions import get_filesList, HistoryDB, get_contentList, log, cutFolder, get_ids_video +from functions import get_filesList, HistoryDB, get_contentList, log, cutFolder, get_ids_video, showMessage import pyxbmct.addonwindow as pyxbmct import Localization @@ -55,7 +55,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.setGeometry(1280, 720, 9, 16) self.set_controls() self.connect_controls() - self.set_navigation() + #self.set_navigation() + self.history() def icon(self, icon): return '%s/icons/%s.png' %(__root__, icon) @@ -70,17 +71,22 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.button_controlcenter = pyxbmct.Button("Control\r\nCenter") self.placeControl(self.button_controlcenter, 0, 9, 1, 2) - self.listing = pyxbmct.List(_imageWidth=40, _imageHeight=40, _itemTextXOffset=10, _itemTextYOffset=2, _itemHeight=40, _space=2, _alignmentY=4) + self.listing = self.listing = pyxbmct.List(_imageWidth=60, _imageHeight=60, _itemTextXOffset=10, + _itemTextYOffset=2, _itemHeight=60, _space=2, _alignmentY=4) self.placeControl(self.listing, 1, 0, 8, 14) self.right_menu() + def connect_controls(self): self.connect(self.listing, self.right_press1) self.connect(self.button_history, self.history) self.connect(self.button_search, self.search) self.connect(self.button_controlcenter, self.controlCenter) + self.connect(pyxbmct.ACTION_NAV_BACK, self.close) + self.connect(pyxbmct.ACTION_PREVIOUS_MENU, self.close) + def set_navigation(self): #Top menu self.input_search.setNavigation(self.listing, self.listing, self.last_right_button, self.button_search) @@ -101,7 +107,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): ('WindowClose', 'effect=fade start=100 end=0 time=500',)]) def search(self, addtime=None): - self.last_action = self.search + self.reconnect(pyxbmct.ACTION_NAV_BACK, self.history) self.right_menu('search') self.listing.reset() query = self.input_search.getText() @@ -124,10 +130,31 @@ class SearchWindow(pyxbmct.AddonDialogWindow): #log(title) self.drawItem(title, 'search_item', link, image) + def history(self): + self.right_menu('history') + self.listing.reset() + self.reconnect(pyxbmct.ACTION_NAV_BACK, self.close) + + db = HistoryDB() + items = db.get_all() + favlist = [(1, '[B]%s[/B]'), (0, '%s')] + if items: + for favbool, bbstring in favlist: + for addtime, string, fav in items: + if favbool == int(fav): + title = string.encode('utf-8') + + if int(fav) == 1: + img = __root__ + '/icons/fav.png' + else: + img = __root__ + '/icons/unfav.png' + + link = {'mode': 'history_search_item', 'url': title, 'addtime': str(addtime), 'fav':str(fav)} + self.drawItem(bbstring % title, link, title, img) + def right_press1(self): item = self.listing.getSelectedItem() params = json.loads(item.getLabel2()) - log('right_press1 params: ' + str(params)) mode = params.get('mode') filename = item.getfilename() label = item.getLabel() @@ -142,53 +169,69 @@ class SearchWindow(pyxbmct.AddonDialogWindow): elif mode == 'torrent_play': action = 'playTorrent' url = self.form_link(action, params) - log('right_press1 url: '+url) xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) self.close() + elif mode == 'history_search_item': + self.input_search.setText(filename) + self.search() def right_press2(self): item = self.listing.getSelectedItem() params = json.loads(item.getLabel2()) - log('right_press2 params: ' + str(params)) mode = params.get('mode') filename = item.getfilename() if mode == 'torrent_play': action = 'downloadFilesList' link = {'ind': str(params.get('url'))} url = self.form_link(action, link) - log('right_press2 url: ' + url) xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) elif mode == 'search_item': action = 'downloadFilesList' link = {'url': filename} url = self.form_link(action, link) - log('right_press2 url: ' + url) xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + elif mode == 'history_search_item': + self.input_search.setText(filename) + self.setFocus(self.input_search) def right_press3(self): item = self.listing.getSelectedItem() params = json.loads(item.getLabel2()) - log('right_press3 params: ' + str(params)) filename = item.getfilename() mode = params.get('mode') if mode == 'torrent_play': action = 'downloadLibtorrent' link = {'ind': str(params.get('url'))} url = self.form_link(action, link) - log('right_press3 url: ' + url) xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) elif mode == 'search_item': action = 'downloadLibtorrent' link = {'url': filename} url = self.form_link(action, link) - log('right_press2 url: ' + url) xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + elif mode == 'history_search_item': + addtime = params.get('addtime') + url = (os.path.join(__root__, 'controlcenter.py,') + + 'addtime=%s&title=%s' % (str(addtime), filename)) + xbmc.executebuiltin('xbmc.RunPlugin(%s)' % (url)) def right_press4(self): - pass + item = self.listing.getSelectedItem() + params = json.loads(item.getLabel2()) + mode = params.get('mode') + if mode == 'history_search_item': + addtime = params.get('addtime') + fav = params.get('fav') + self.history_action('fav', addtime, fav) def right_press5(self): - pass + item = self.listing.getSelectedItem() + params = json.loads(item.getLabel2()) + mode = params.get('mode') + if mode == 'history_search_item': + addtime = params.get('addtime') + fav = params.get('fav') + self.history_action('delete', addtime, fav) def right_press6(self): pass @@ -221,18 +264,23 @@ class SearchWindow(pyxbmct.AddonDialogWindow): params = {'mode': 'torrent_play', 'url': identifier, 'url2': ids_video.rstrip(',')} self.drawItem(title, params, link) - def history(self): - self.right_menu('history') + def history_action(self, action, addtime, fav): + db = HistoryDB() - def history_search(self): - xbmcgui.Dialog().ok('xxx','xxx') - log('history_search: '+self.listing.getSelectedItem().getLabel()) + if action == 'delete': + db.delete(addtime) + showMessage(self.localize('Search History'), self.localize('Deleted!')) + + if action == 'fav' and fav == '0': + db.fav(addtime) + showMessage(self.localize('Favourites'), self.localize('Added!')) + elif action == 'fav': + db.unfav(addtime) + showMessage(self.localize('Favourites'), self.localize('Deleted!')) + + self.history() def right_menu(self, mode='place'): - - log('self.actions_connected: ' + str(self.actions_connected)) - log('self.controls_connected: ' + str(self.controls_connected)) - if not mode == 'place': self.last_right_buttons_count = self.right_buttons_count remove_list = [getattr(self, "button_right" + str(index)) for index @@ -250,8 +298,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.localize('Download via Libtorrent')] elif mode == 'history': - label_list = ["Search", - "Open2","Open2","Open2","Open2"] + label_list = [self.localize('Open'), + self.localize('Edit'), + self.localize('Individual Tracker Options'), + 'Fav/Unfav', + self.localize('Delete')] self.right_buttons_count = len(label_list) button_num_list = range(1, self.right_buttons_count+1) @@ -316,6 +367,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): xbmc.executebuiltin( 'xbmc.RunScript(%s,)' % os.path.join(__root__, 'controlcenter.py')) + def reconnect(self, event, callable): + self.disconnect(event) + self.connect(event, callable) + def log(msg): try: xbmc.log("### [%s]: %s" % (__plugin__,msg,), level=xbmc.LOGNOTICE ) From 0bdb6ae37fbb6ac0e4be1104053db9ff4494274d Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Mon, 28 Nov 2016 23:29:09 +0300 Subject: [PATCH 034/126] dht bit fix --- SkorbaLoader.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/SkorbaLoader.py b/SkorbaLoader.py index 813c2e0..b58d1f5 100644 --- a/SkorbaLoader.py +++ b/SkorbaLoader.py @@ -156,14 +156,11 @@ class SkorbaLoader: } progressBar = xbmcgui.DialogProgress() progressBar.create(Localization.localize('Please Wait'), Localization.localize('Magnet-link is converting')) - #try: self.torrentHandle = self.session.add_torrent(magnetSettings) - #except: - # self.torrentHandle = self.lt.add_magnet_uri(self.session, self.magnetLink, magnetSettings) iterator = 0 + if self.enable_dht: self.torrentHandle.force_dht_announce() while iterator < 100: xbmc.sleep(500) - if self.enable_dht: self.torrentHandle.force_dht_announce() progressBar.update(iterator, Localization.localize('Please Wait'), Localization.localize('Magnet-link is converting')+'.' * (iterator % 4), ' ') iterator += 1 if progressBar.iscanceled(): From 9cfc007a29daf222a5aaff954dc8adc600134182 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Mon, 28 Nov 2016 23:31:26 +0300 Subject: [PATCH 035/126] fixes --- searchwindow.py | 197 ++++++++++++++++++++++++------------------------ 1 file changed, 100 insertions(+), 97 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index f6584fb..b08bcf7 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -77,7 +77,6 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.right_menu() - def connect_controls(self): self.connect(self.listing, self.right_press1) self.connect(self.button_history, self.history) @@ -152,95 +151,28 @@ class SearchWindow(pyxbmct.AddonDialogWindow): link = {'mode': 'history_search_item', 'url': title, 'addtime': str(addtime), 'fav':str(fav)} self.drawItem(bbstring % title, link, title, img) - def right_press1(self): - item = self.listing.getSelectedItem() - params = json.loads(item.getLabel2()) - mode = params.get('mode') - filename = item.getfilename() - label = item.getLabel() - tdir = params.get('tdir') - self.listing.reset() - if mode == 'search_item': - self.open_torrent(filename) - elif mode == 'torrent_subfolder': - self.open_torrent(filename, tdir) - elif mode == 'torrent_moveup': - self.last_action() - elif mode == 'torrent_play': - action = 'playTorrent' - url = self.form_link(action, params) - xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) - self.close() - elif mode == 'history_search_item': - self.input_search.setText(filename) - self.search() + def history_action(self, action, addtime, fav): + db = HistoryDB() - def right_press2(self): - item = self.listing.getSelectedItem() - params = json.loads(item.getLabel2()) - mode = params.get('mode') - filename = item.getfilename() - if mode == 'torrent_play': - action = 'downloadFilesList' - link = {'ind': str(params.get('url'))} - url = self.form_link(action, link) - xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) - elif mode == 'search_item': - action = 'downloadFilesList' - link = {'url': filename} - url = self.form_link(action, link) - xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) - elif mode == 'history_search_item': - self.input_search.setText(filename) - self.setFocus(self.input_search) + if action == 'delete': + db.delete(addtime) + showMessage(self.localize('Search History'), self.localize('Deleted!')) - def right_press3(self): - item = self.listing.getSelectedItem() - params = json.loads(item.getLabel2()) - filename = item.getfilename() - mode = params.get('mode') - if mode == 'torrent_play': - action = 'downloadLibtorrent' - link = {'ind': str(params.get('url'))} - url = self.form_link(action, link) - xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) - elif mode == 'search_item': - action = 'downloadLibtorrent' - link = {'url': filename} - url = self.form_link(action, link) - xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) - elif mode == 'history_search_item': - addtime = params.get('addtime') - url = (os.path.join(__root__, 'controlcenter.py,') + - 'addtime=%s&title=%s' % (str(addtime), filename)) - xbmc.executebuiltin('xbmc.RunPlugin(%s)' % (url)) + if action == 'fav' and fav == '0': + db.fav(addtime) + showMessage(self.localize('Favourites'), self.localize('Added!')) + elif action == 'fav': + db.unfav(addtime) + showMessage(self.localize('Favourites'), self.localize('Deleted!')) - def right_press4(self): - item = self.listing.getSelectedItem() - params = json.loads(item.getLabel2()) - mode = params.get('mode') - if mode == 'history_search_item': - addtime = params.get('addtime') - fav = params.get('fav') - self.history_action('fav', addtime, fav) - - def right_press5(self): - item = self.listing.getSelectedItem() - params = json.loads(item.getLabel2()) - mode = params.get('mode') - if mode == 'history_search_item': - addtime = params.get('addtime') - fav = params.get('fav') - self.history_action('delete', addtime, fav) - - def right_press6(self): - pass + self.history() def open_torrent(self, link, tdir = None): #cache if link != self.last_link: self.contentList = get_contentList(link) self.last_link = link + self.reconnect(pyxbmct.ACTION_NAV_BACK, self.search) dirList, contentListNew = cutFolder(self.contentList, tdir) @@ -264,22 +196,6 @@ class SearchWindow(pyxbmct.AddonDialogWindow): params = {'mode': 'torrent_play', 'url': identifier, 'url2': ids_video.rstrip(',')} self.drawItem(title, params, link) - def history_action(self, action, addtime, fav): - db = HistoryDB() - - if action == 'delete': - db.delete(addtime) - showMessage(self.localize('Search History'), self.localize('Deleted!')) - - if action == 'fav' and fav == '0': - db.fav(addtime) - showMessage(self.localize('Favourites'), self.localize('Added!')) - elif action == 'fav': - db.unfav(addtime) - showMessage(self.localize('Favourites'), self.localize('Deleted!')) - - self.history() - def right_menu(self, mode='place'): if not mode == 'place': self.last_right_buttons_count = self.right_buttons_count @@ -334,6 +250,93 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.set_navigation() + def right_press1(self): + item = self.listing.getSelectedItem() + params = json.loads(item.getLabel2()) + mode = params.get('mode') + filename = item.getfilename() + label = item.getLabel() + tdir = params.get('tdir') + self.listing.reset() + if mode == 'search_item': + self.open_torrent(filename) + elif mode == 'torrent_subfolder': + self.open_torrent(filename, tdir) + elif mode == 'torrent_moveup': + self.search() + self.setFocus(self.listing) + elif mode == 'torrent_play': + action = 'playTorrent' + url = self.form_link(action, params) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + self.close() + elif mode == 'history_search_item': + addtime = params.get('addtime') + self.input_search.setText(filename) + self.search(addtime) + + def right_press2(self): + item = self.listing.getSelectedItem() + params = json.loads(item.getLabel2()) + mode = params.get('mode') + filename = item.getfilename() + if mode == 'torrent_play': + action = 'downloadFilesList' + link = {'ind': str(params.get('url'))} + url = self.form_link(action, link) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + elif mode == 'search_item': + action = 'downloadFilesList' + link = {'url': filename} + url = self.form_link(action, link) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + elif mode == 'history_search_item': + self.input_search.setText(filename) + self.setFocus(self.input_search) + + def right_press3(self): + item = self.listing.getSelectedItem() + params = json.loads(item.getLabel2()) + filename = item.getfilename() + mode = params.get('mode') + if mode == 'torrent_play': + action = 'downloadLibtorrent' + link = {'ind': str(params.get('url'))} + url = self.form_link(action, link) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + elif mode == 'search_item': + action = 'downloadLibtorrent' + link = {'url': filename} + url = self.form_link(action, link) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + elif mode == 'history_search_item': + addtime = params.get('addtime') + url = (os.path.join(__root__, 'controlcenter.py,') + + 'addtime=%s&title=%s' % (str(addtime), urllib.quote_plus(filename))) + log(url) + xbmc.executebuiltin('xbmc.RunScript(%s)' % (url)) + + def right_press4(self): + item = self.listing.getSelectedItem() + params = json.loads(item.getLabel2()) + mode = params.get('mode') + if mode == 'history_search_item': + addtime = params.get('addtime') + fav = params.get('fav') + self.history_action('fav', addtime, fav) + + def right_press5(self): + item = self.listing.getSelectedItem() + params = json.loads(item.getLabel2()) + mode = params.get('mode') + if mode == 'history_search_item': + addtime = params.get('addtime') + fav = params.get('fav') + self.history_action('delete', addtime, fav) + + def right_press6(self): + pass + def localize(self, string): try: return Localization.localize(string) From ec149abdc6ea153e91578c5c306375c43a9e2c3d Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Tue, 29 Nov 2016 21:47:17 +0300 Subject: [PATCH 036/126] titlemake --- Core.py | 18 +++++++++++++++--- resources/language/English/strings.xml | 4 ++++ resources/language/Russian/strings.xml | 6 +++++- resources/settings.xml | 21 +++++++++++---------- 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/Core.py b/Core.py index e25a687..cf95322 100644 --- a/Core.py +++ b/Core.py @@ -38,6 +38,7 @@ class Core: open_option = int(__settings__.getSetting('open_option')) language = {0: 'en', 1: 'ru', 2: 'uk', 3: 'he', 4: 'hu'}.get(int(__settings__.getSetting("language"))) scrapperDB_ver = {'en':'1.1', 'ru':'1.3', 'he':'1.3'} + torrent_info_style = int(__settings__.getSetting('torrent_info_style')) log('SYS ARGV: ' + str(sys.argv)) @@ -1851,9 +1852,20 @@ class Core: clRed = '[COLOR FFFF0000]%s[/COLOR]' title = title.replace('720p', '[B]720p[/B]').replace('1080p', '[B]1080p[/B]') - title = clWhite % title - second = '[I](%s) [S/L: %d/%d] [/I]' % (size, seeds, leechers) - title += ' ' + second + + if self.torrent_info_style == 0: + title = clWhite % title + second = '[I](%s) [S/L: %d/%d] [/I]' % (size, seeds, leechers) + title += ' ' + second + elif self.torrent_info_style == 1: + title = clWhite % title + second = '[I](%s) [S/L: %d/%d] [/I]' % (size, seeds, leechers) + title = second + ' ' + title + elif self.torrent_info_style == 2: + title = clWhite % title + second = '[I](%s) [S/L: %d/%d] [/I]' % (size, seeds, leechers) + title += '\r\n' + clDimgray % second + return title def search(self, params={}): diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index d58ab3b..224b7f3 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -69,6 +69,10 @@ Append size to file name Enable DHT Estuary (by DiMartino) + Стиль информации о раздаче + In the end + In the beginning + Second string Interface P2P Network Advanced diff --git a/resources/language/Russian/strings.xml b/resources/language/Russian/strings.xml index 015559c..9135c31 100644 --- a/resources/language/Russian/strings.xml +++ b/resources/language/Russian/strings.xml @@ -68,7 +68,11 @@ pyrrent2http (python-libtorrent по http) Добавлять размер к имени файла Включить DHT - Estuary (от DiMartino) + Estuary (от DiMartino) + Стиль информации о раздаче + В конце + В начале + Второй строкой Интерфейс P2P Сеть Дополнительные diff --git a/resources/settings.xml b/resources/settings.xml index ff71017..17aa405 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -61,15 +61,16 @@ - - - - - - - - - - + + + + + + + + + + + From 155c10cc91f6513bdef4a00d1ae6c4fbe16bf821 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Tue, 29 Nov 2016 21:47:37 +0300 Subject: [PATCH 037/126] rename response --- SearcherABC.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/SearcherABC.py b/SearcherABC.py index 35f1b3d..913c8d2 100644 --- a/SearcherABC.py +++ b/SearcherABC.py @@ -134,13 +134,14 @@ class SearcherABC: self.log('[makeRequest]: HTTP Error, e.code=' + str(e.code)) return #self.cookieJar.extract_cookies(response, urllib2) + #self.log(response.info().get('Set-Cookie')) if response.info().get('Content-Encoding') == 'gzip': buf = StringIO(response.read()) decomp = zlib.decompressobj(16 + zlib.MAX_WBITS) - response = decomp.decompress(buf.getvalue()) + text = decomp.decompress(buf.getvalue()) else: - response = response.read() - return response + text = response.read() + return text def askCaptcha(self, url): temp_dir = self.tempdir() From 329dac9c32858ab92b0ee62cba20d478c078c1dc Mon Sep 17 00:00:00 2001 From: Sergey Kolosovskiy Date: Tue, 29 Nov 2016 21:41:30 +0200 Subject: [PATCH 038/126] Autopause on play fix Time after time when playing large files the setting "pause_onplay" didn't actually pause the playback on start. --- Inposloader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Inposloader.py b/Inposloader.py index bd5f2eb..4b5c1dc 100644 --- a/Inposloader.py +++ b/Inposloader.py @@ -541,7 +541,7 @@ class InposPlayer(xbmc.Player): self.iterator = int(file_status.progress * 100) - if pause and self.__settings__.getSetting("pause_onplay") == 'true': + if pause and (self.__settings__.getSetting("pause_onplay") == 'true') and (self.getTime() > 0): pause = False xbmc.Player().pause() xbmc.sleep(1000) From a342649f418de886bae1dc21d221a3ec308c8a42 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Tue, 29 Nov 2016 23:29:11 +0300 Subject: [PATCH 039/126] context menu --- .idea/misc.xml | 5 +- .idea/plugin.video.torrenter.iml | 5 +- .idea/workspace.xml | 2118 ++++++++++++++++++------------ Core.py | 1 - searchwindow.py | 86 +- 5 files changed, 1374 insertions(+), 841 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 5ca5e8e..2c3cc30 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,4 @@ - - - + + \ No newline at end of file diff --git a/.idea/plugin.video.torrenter.iml b/.idea/plugin.video.torrenter.iml index a34a857..ca32dfa 100644 --- a/.idea/plugin.video.torrenter.iml +++ b/.idea/plugin.video.torrenter.iml @@ -2,8 +2,7 @@ - + - - + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index dd00281..a1da39e 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,10 +1,12 @@ - + + + - - + + @@ -31,219 +33,58 @@ - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -253,12 +94,415 @@ + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -266,28 +510,18 @@ - - + + - - + + - - - - - - - - - - - - + + @@ -304,6 +538,48 @@ + + + HistoryDB + self.db + controlCenter + setAnimation + AddonDialogWindow + showFilesList + openSection + items + Default + save_folder + xbmc.Run + addI + downloadFilesList + .info() + info + self.torrentFileInfo + name + chooseHASH + self.button_right1 + set_navigation + right_buttons_count + self.reconnect(pyxbmct.ACTION_NAV_BACK, self.close) + progressBar + getTorrentFile + 30018 + titleMake + params + version_check + right_press1 + last_mode + + + pyxbmct.Button( + button_history + button_right1 + self.right_press1 + action + self.progressBar + + @@ -315,19 +591,6 @@ @@ -375,16 +651,7 @@ - - - - - - - - - - + @@ -402,12 +669,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + - + + @@ -731,111 +957,6 @@ @@ -1090,13 +1316,13 @@ - + - + - - + + @@ -1105,13 +1331,31 @@ - + + + + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - + - - + - - - - - - - - - + - + - + - + - + - + - - - + + - + - - - + + - + - - - + + - + - - - - - - - - - - - - - - - - - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Core.py b/Core.py index cf95322..2644659 100644 --- a/Core.py +++ b/Core.py @@ -1908,7 +1908,6 @@ class Core: dialog_items.append('[' + str(data['progress']) + '%] ' + data['name']) dialog_items_clean.append(data['name']) - log('[chooseHASH]: name %s ' % str(name)) for data in dat: # Debug('[chooseHASH]: '+str((data['name'], data['id'], data['dir'].encode('utf-8')))) diff --git a/searchwindow.py b/searchwindow.py index b08bcf7..829f4df 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -22,7 +22,7 @@ import sys, os, urllib, json import xbmcaddon import xbmc import xbmcgui -from functions import get_filesList, HistoryDB, get_contentList, log, cutFolder, get_ids_video, showMessage +from functions import get_filesList, HistoryDB, get_contentList, log, cutFolder, get_ids_video, showMessage, getParameters import pyxbmct.addonwindow as pyxbmct import Localization @@ -37,6 +37,9 @@ log('SYS ARGV: ' + str(sys.argv)) #https://github.com/xbmc/xbmc/blob/8d4a5bba55638dfd0bdc5e7de34f3e5293f99933/xbmc/input/Key.h ACTION_STOP = 13 ACTION_PLAYER_PLAY = 79 +ACTION_MOUSE_RIGHT_CLICK = 101 +ACTION_CONTEXT_MENU = 117 +ACTION_SHOW_OSD = 24 class SearchWindow(pyxbmct.AddonDialogWindow): __settings__ = sys.modules["__main__"].__settings__ @@ -71,8 +74,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.button_controlcenter = pyxbmct.Button("Control\r\nCenter") self.placeControl(self.button_controlcenter, 0, 9, 1, 2) - self.listing = self.listing = pyxbmct.List(_imageWidth=60, _imageHeight=60, _itemTextXOffset=10, - _itemTextYOffset=2, _itemHeight=60, _space=2, _alignmentY=4) + self.listing = pyxbmct.List(_imageWidth=60, _imageHeight=60, _itemTextXOffset=1, + _itemTextYOffset=0, _itemHeight=50, _space=0, _alignmentY=4) self.placeControl(self.listing, 1, 0, 8, 14) self.right_menu() @@ -85,6 +88,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.connect(pyxbmct.ACTION_NAV_BACK, self.close) self.connect(pyxbmct.ACTION_PREVIOUS_MENU, self.close) + self.connect(ACTION_MOUSE_RIGHT_CLICK, self.context) + self.connect(ACTION_CONTEXT_MENU, self.context) + self.connect(ACTION_SHOW_OSD, self.context) + def set_navigation(self): #Top menu @@ -196,6 +203,40 @@ class SearchWindow(pyxbmct.AddonDialogWindow): params = {'mode': 'torrent_play', 'url': identifier, 'url2': ids_video.rstrip(',')} self.drawItem(title, params, link) + def get_menulist(self, mode): + + label_list = ["Empty","Empty","Empty","Empty","Empty","Empty"] + + if mode in ['search', 'search_item', 'torrent_play']: + label_list = ["Open", + self.localize('Download via T-client'), + self.localize('Download via Libtorrent')] + elif mode in ['torrent_subfolder', 'torrent_moveup']: + label_list = ["Open"] + elif mode in ['history', 'history_search_item']: + label_list = [self.localize('Open'), + self.localize('Edit'), + self.localize('Individual Tracker Options'), + 'Fav/Unfav', + self.localize('Delete')] + + return label_list + + def context(self): + if self.getFocus() == self.listing: + item = self.listing.getSelectedItem() + params = json.loads(item.getLabel2()) + mode = params.get('mode') + label_list = self.get_menulist(mode) + + if not self.version_check(): + ret = xbmcgui.Dialog().select(self.localize('Context menu'), label_list) + else: + ret = xbmcgui.Dialog().contextmenu(list=[(x) for x in label_list]) + + if ret > -1 and ret < len(label_list): + getattr(self, "right_press" + str(ret + 1))() + def right_menu(self, mode='place'): if not mode == 'place': self.last_right_buttons_count = self.right_buttons_count @@ -204,21 +245,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.disconnectEventList(remove_list) self.removeControls(remove_list) - label_list = [] - if mode == 'place': - label_list = ["Empty","Empty","Empty","Empty","Empty","Empty"] - - elif mode == 'search': - label_list = ["Open", - self.localize('Download via T-client'), - self.localize('Download via Libtorrent')] - - elif mode == 'history': - label_list = [self.localize('Open'), - self.localize('Edit'), - self.localize('Individual Tracker Options'), - 'Fav/Unfav', - self.localize('Delete')] + label_list = self.get_menulist(mode) self.right_buttons_count = len(label_list) button_num_list = range(1, self.right_buttons_count+1) @@ -374,6 +401,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.disconnect(event) self.connect(event, callable) + def version_check(self): + return False if int(xbmc.getInfoLabel( "System.BuildVersion" )[:2]) < 17 else True + def log(msg): try: xbmc.log("### [%s]: %s" % (__plugin__,msg,), level=xbmc.LOGNOTICE ) @@ -398,9 +428,25 @@ def titleMake(seeds, leechers, size, title): title += '\r\n' + clDimgray % second return title -if __name__ == "__main__": +def main(): dialog = SearchWindow("Torrenter Search Window") dialog.doModal() del dialog #You need to delete your instance when it is no longer needed - #because underlying xbmcgui classes are not grabage-collected. \ No newline at end of file + #because underlying xbmcgui classes are not grabage-collected. + + +if __name__ == '__main__': + if len(sys.argv) > 1: + params = getParameters(sys.argv[1]) + else: + params = {} + + try: + main() + except Exception, e: + import xbmc + import traceback + + map(xbmc.log, traceback.format_exc().split("\n")) + raise \ No newline at end of file From 4b7c72ad58f375b685f93129a1d6c8f7875cf9a4 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Tue, 29 Nov 2016 23:55:05 +0300 Subject: [PATCH 040/126] filename update --- searchwindow.py | 48 +++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index 829f4df..ccc242c 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -92,7 +92,6 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.connect(ACTION_CONTEXT_MENU, self.context) self.connect(ACTION_SHOW_OSD, self.context) - def set_navigation(self): #Top menu self.input_search.setNavigation(self.listing, self.listing, self.last_right_button, self.button_search) @@ -133,8 +132,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if 1==1: for (order, seeds, leechers, size, title, link, image) in self.filesList: title = titleMake(seeds, leechers, size, title) - #log(title) - self.drawItem(title, 'search_item', link, image) + self.drawItem(title, {'mode':'search_item', 'filename': link}, image) def history(self): self.right_menu('history') @@ -155,8 +153,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): else: img = __root__ + '/icons/unfav.png' - link = {'mode': 'history_search_item', 'url': title, 'addtime': str(addtime), 'fav':str(fav)} - self.drawItem(bbstring % title, link, title, img) + link = {'mode': 'history_search_item', 'filename': title, 'addtime': str(addtime), 'fav':str(fav)} + self.drawItem(bbstring % title, link, img) def history_action(self, action, addtime, fav): db = HistoryDB() @@ -184,13 +182,14 @@ class SearchWindow(pyxbmct.AddonDialogWindow): dirList, contentListNew = cutFolder(self.contentList, tdir) if not tdir: - self.drawItem('..', 'torrent_moveup', link, isFolder=True) + self.drawItem('..', {'mode': 'torrent_moveup', 'filename': link}, isFolder=True) else: - params = {'mode': 'torrent_subfolder'} - self.drawItem('..', params, link, isFolder=True) + params = {'mode': 'torrent_subfolder', 'filename': link} + self.drawItem('..', params, isFolder=True) + dirList = sorted(dirList, key=lambda x: x[0], reverse=False) for title in dirList: - self.drawItem(title, {'mode':'torrent_subfolder', 'tdir': title}, link, isFolder=True) + self.drawItem(title, {'mode':'torrent_subfolder', 'tdir': title, 'filename': link}, isFolder=True) ids_video_result = get_ids_video(contentListNew) ids_video='' @@ -199,9 +198,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): for identifier in ids_video_result: ids_video = ids_video + str(identifier) + ',' + contentListNew = sorted(contentListNew, key=lambda x: x[0], reverse=False) for title, identifier, filesize in contentListNew: - params = {'mode': 'torrent_play', 'url': identifier, 'url2': ids_video.rstrip(',')} - self.drawItem(title, params, link) + params = {'mode': 'torrent_play', 'url': identifier, 'url2': ids_video.rstrip(','), 'filename': link} + self.drawItem(title, params) def get_menulist(self, mode): @@ -225,8 +225,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def context(self): if self.getFocus() == self.listing: item = self.listing.getSelectedItem() - params = json.loads(item.getLabel2()) + params = json.loads(item.getfilename()) mode = params.get('mode') + filename = params.get('filename') label_list = self.get_menulist(mode) if not self.version_check(): @@ -279,10 +280,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def right_press1(self): item = self.listing.getSelectedItem() - params = json.loads(item.getLabel2()) + params = json.loads(item.getfilename()) mode = params.get('mode') - filename = item.getfilename() - label = item.getLabel() + filename = params.get('filename') tdir = params.get('tdir') self.listing.reset() if mode == 'search_item': @@ -304,9 +304,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def right_press2(self): item = self.listing.getSelectedItem() - params = json.loads(item.getLabel2()) + params = json.loads(item.getfilename()) mode = params.get('mode') - filename = item.getfilename() + filename = params.get('filename') if mode == 'torrent_play': action = 'downloadFilesList' link = {'ind': str(params.get('url'))} @@ -323,9 +323,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def right_press3(self): item = self.listing.getSelectedItem() - params = json.loads(item.getLabel2()) - filename = item.getfilename() + params = json.loads(item.getfilename()) mode = params.get('mode') + filename = params.get('filename') if mode == 'torrent_play': action = 'downloadLibtorrent' link = {'ind': str(params.get('url'))} @@ -345,8 +345,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def right_press4(self): item = self.listing.getSelectedItem() - params = json.loads(item.getLabel2()) + params = json.loads(item.getfilename()) mode = params.get('mode') + filename = params.get('filename') if mode == 'history_search_item': addtime = params.get('addtime') fav = params.get('fav') @@ -354,8 +355,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def right_press5(self): item = self.listing.getSelectedItem() - params = json.loads(item.getLabel2()) + params = json.loads(item.getfilename()) mode = params.get('mode') + filename = params.get('filename') if mode == 'history_search_item': addtime = params.get('addtime') fav = params.get('fav') @@ -370,7 +372,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): except: return string - def drawItem(self, title, params, link, image = None, isFolder = False): + def drawItem(self, title, params, image = None, isFolder = False): if isinstance(params, str): params = {'mode': params} @@ -378,7 +380,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): image = 'DefaultFolder.png' elif not image: image = 'DefaultVideo.png' - listitem = xbmcgui.ListItem(title, json.dumps(params), image, image, link) + listitem = xbmcgui.ListItem(title, '', image, image, json.dumps(params)) self.listing.addItem(listitem) def form_link(self, action, link): From 8c5090482d6c4741c384a108f736fd819f591472 Mon Sep 17 00:00:00 2001 From: Kingul Date: Wed, 30 Nov 2016 14:59:47 +0200 Subject: [PATCH 041/126] testing metahandler info --- searchwindow.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index ccc242c..bf6082a 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -25,6 +25,7 @@ import xbmcgui from functions import get_filesList, HistoryDB, get_contentList, log, cutFolder, get_ids_video, showMessage, getParameters import pyxbmct.addonwindow as pyxbmct import Localization +import re __settings__ = xbmcaddon.Addon(id='plugin.video.torrenter') __language__ = __settings__.getLocalizedString @@ -75,8 +76,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.placeControl(self.button_controlcenter, 0, 9, 1, 2) self.listing = pyxbmct.List(_imageWidth=60, _imageHeight=60, _itemTextXOffset=1, - _itemTextYOffset=0, _itemHeight=50, _space=0, _alignmentY=4) + _itemTextYOffset=0, _itemHeight=60, _space=0, _alignmentY=4) self.placeControl(self.listing, 1, 0, 8, 14) + self.logoimg = pyxbmct.Image(__root__ + '/icons/fav.png') + self.placeControl(self.logoimg, 200, 300, 1, 5) self.right_menu() @@ -210,7 +213,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if mode in ['search', 'search_item', 'torrent_play']: label_list = ["Open", self.localize('Download via T-client'), - self.localize('Download via Libtorrent')] + self.localize('Download via Libtorrent'), + 'Info'] elif mode in ['torrent_subfolder', 'torrent_moveup']: label_list = ["Open"] elif mode in ['history', 'history_search_item']: @@ -352,6 +356,12 @@ class SearchWindow(pyxbmct.AddonDialogWindow): addtime = params.get('addtime') fav = params.get('fav') self.history_action('fav', addtime, fav) + else: + cleanlabel = re.sub('\[[^\]]*\]', '', item.getLabel()) + titlu, an = xbmc.getCleanMovieTitle(cleanlabel) + infoW = InfoWindow(titlu) + infoW.doModal() + del infoW def right_press5(self): item = self.listing.getSelectedItem() @@ -406,6 +416,48 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def version_check(self): return False if int(xbmc.getInfoLabel( "System.BuildVersion" )[:2]) < 17 else True + + +class InfoWindow(pyxbmct.AddonDialogWindow): + + + def __init__(self, title=""): + super(InfoWindow, self).__init__(title) + self.title = title + self.setGeometry(600, 600, 9, 16) + self.set_controls() + self.connect_controls() + #self.set_navigation() + + + def set_controls(self): + self.listing = pyxbmct.List(_imageWidth=40, _imageHeight=40, _itemTextXOffset=1, + _itemTextYOffset=0, _itemHeight=40, _space=0, _alignmentY=4) + self.placeControl(self.listing, 2, 0, 8, 14) + self.logoimg = pyxbmct.Image((__root__ + '/icons/fav.png'), aspectRatio=0) + self.placeControl(self.logoimg, 0, 5, 2, 5) + #self.button_search = pyxbmct.Button("Search") + #self.placeControl(self.button_search, 0, 5, 1, 2) + + + def connect_controls(self): + #this need script.module.metahandler + + from metahandler import metahandlers + mg = metahandlers.MetaData() + meta = mg.get_meta('movie', name=self.title) + + """ + meta results for star wars + {'rating': 7.7999999999999998, 'year': 1983, 'duration': u'0', 'plot': u'N/A', 'votes': u'362', 'title': 'Star Wars', 'tagline': u'', 'writer': u'N/A', 'imgs_prepacked': u'false', 'backdrop_url': '', 'tmdb_id': u'', 'cover_url': u'https://images-na.ssl-images-amazon.com/images/M/MV5BMWJhYWQ3ZTEtYTVkOS00ZmNlLWIxZjYtODZjNTlhMjMzNGM2XkEyXkFqcGdeQXVyNzg5OTk2OA@@._V1_SX300.jpg', 'imdb_id': u'tt0251413', 'director': u'N/A', 'studio': u'', 'genre': u'Action, Adventure, Sci-Fi', 'thumb_url': u'', 'overlay': 6, 'premiered': u'1983-05-01', 'cast': [], 'mpaa': u'N/A', 'playcount': 0, 'trailer_url': u'', 'trailer': ''} + """ + self.connect(pyxbmct.ACTION_NAV_BACK, self.close) + self.connect(pyxbmct.ACTION_PREVIOUS_MENU, self.close) + self.listing.addItem ("genre: %s" % meta['genre']) + self.listing.addItem ("rating: %s" % meta['rating']) + self.listing.addItem ("year: %s" % meta['year']) + self.logoimg.setImage (meta['cover_url']) + def log(msg): try: xbmc.log("### [%s]: %s" % (__plugin__,msg,), level=xbmc.LOGNOTICE ) @@ -451,4 +503,4 @@ if __name__ == '__main__': import traceback map(xbmc.log, traceback.format_exc().split("\n")) - raise \ No newline at end of file + raise From 7ad9a9a2bf8318933e4b83650065db0c87659e58 Mon Sep 17 00:00:00 2001 From: Kingul Date: Wed, 30 Nov 2016 20:02:38 +0200 Subject: [PATCH 042/126] using own scraper --- searchwindow.py | 49 +++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index bf6082a..936c710 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -358,8 +358,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.history_action('fav', addtime, fav) else: cleanlabel = re.sub('\[[^\]]*\]', '', item.getLabel()) - titlu, an = xbmc.getCleanMovieTitle(cleanlabel) - infoW = InfoWindow(titlu) + ttl, yr = xbmc.getCleanMovieTitle(cleanlabel) + infoW = InfoWindow(ttl, yr) infoW.doModal() del infoW @@ -421,42 +421,51 @@ class SearchWindow(pyxbmct.AddonDialogWindow): class InfoWindow(pyxbmct.AddonDialogWindow): - def __init__(self, title=""): + def __init__(self, title="", year=""): super(InfoWindow, self).__init__(title) self.title = title - self.setGeometry(600, 600, 9, 16) + self.year = year + self.setGeometry(600, 600, 3, 3) self.set_controls() self.connect_controls() #self.set_navigation() def set_controls(self): - self.listing = pyxbmct.List(_imageWidth=40, _imageHeight=40, _itemTextXOffset=1, - _itemTextYOffset=0, _itemHeight=40, _space=0, _alignmentY=4) - self.placeControl(self.listing, 2, 0, 8, 14) - self.logoimg = pyxbmct.Image((__root__ + '/icons/fav.png'), aspectRatio=0) - self.placeControl(self.logoimg, 0, 5, 2, 5) + #pyxbmct.AddonWindow().setImage(__root__ + '/resources/skins/Default/media/ConfluenceDialogBack.png') + #self.placeControl(self.background, 0, 0, rowspan=3, columnspan=2) + self.listing = pyxbmct.List(_imageWidth=30, _imageHeight=30, _itemTextXOffset=1, + _itemTextYOffset=0, _itemHeight=30, _space=0, _alignmentY=0) + self.placeControl(self.listing, 0, 1, 2, 2) + self.logoimg = pyxbmct.Image('', aspectRatio=0) + self.placeControl(self.logoimg, 0, 0, rowspan=2) + self.plot = pyxbmct.TextBox() + self.placeControl(self.plot, 2, 0, 1, columnspan=3) + self.plot.autoScroll(1000, 1000, 1000) #self.button_search = pyxbmct.Button("Search") #self.placeControl(self.button_search, 0, 5, 1, 2) def connect_controls(self): - #this need script.module.metahandler - - from metahandler import metahandlers - mg = metahandlers.MetaData() - meta = mg.get_meta('movie', name=self.title) + from resources.scrapers.scrapers import Scrapers + self.Scraper = Scrapers() + meta = self.Scraper.scraper('tmdb', {'label': 'tmdb', 'search': self.title, 'year': ''}, 'en') + meta = meta.get('info') """ - meta results for star wars - {'rating': 7.7999999999999998, 'year': 1983, 'duration': u'0', 'plot': u'N/A', 'votes': u'362', 'title': 'Star Wars', 'tagline': u'', 'writer': u'N/A', 'imgs_prepacked': u'false', 'backdrop_url': '', 'tmdb_id': u'', 'cover_url': u'https://images-na.ssl-images-amazon.com/images/M/MV5BMWJhYWQ3ZTEtYTVkOS00ZmNlLWIxZjYtODZjNTlhMjMzNGM2XkEyXkFqcGdeQXVyNzg5OTk2OA@@._V1_SX300.jpg', 'imdb_id': u'tt0251413', 'director': u'N/A', 'studio': u'', 'genre': u'Action, Adventure, Sci-Fi', 'thumb_url': u'', 'overlay': 6, 'premiered': u'1983-05-01', 'cast': [], 'mpaa': u'N/A', 'playcount': 0, 'trailer_url': u'', 'trailer': ''} + meta results for xXx + {'info': {'count': 7451, 'plot': u'Xander Cage is your standard adrenaline junkie with no fear and a lousy attitude. When the US Government "recruits" him to go on a mission, he\'s not exactly thrilled. His mission: to gather information on an organization that may just be planning the destruction of the world, led by the nihilistic Yorgi.', 'votes': u'809', 'code': u'tt0295701', 'rating': 5.7000000000000002, 'title': u'xXx', 'tagline': u'A New Breed Of Secret Agent.', 'director': u'Rob Cohen', 'premiered': u'2002-08-09', 'originaltitle': u'xXx', 'cast': [u'Vin Diesel', u'Asia Argento', u'Marton Csokas', u'Samuel L. Jackson', u'Michael Roof', u'Petr J\xe1kl Jr.', u'Richy M\xfcller', u'Joe Bucaro III', u'Eve', u'Leila Arcieri', u'William Hope', u'Ted Maynard', u'Martin Hub'], 'castandrole': [u'Vin Diesel|Xander Cage', u'Asia Argento|Yelena', u'Marton Csokas|Yorgi', u'Samuel L. Jackson|Agent Gibbons', u'Michael Roof|Agent Toby Lee Shavers', u'Petr J\xe1kl Jr.|Kolya', u'Richy M\xfcller|Milan Sova', u'Joe Bucaro III|Virg', u'Eve|J.J.', u'Leila Arcieri|Jordan King', u'William Hope|Agent Roger Donnan', u'Ted Maynard|James Tannick', u'Martin Hub|Ivan Podrov'], 'studio': u'Columbia Pictures, Original Film, Revolution Studios', 'year': 2002, 'genre': u'Action', 'runtime': u'124'}, 'thumbnail': u'http://image.tmdb.org/t/p/original/fPHNTG1OXFBQ6aEVO7Lv8tSgfrY.jpg', 'label': 'tmdb', 'properties': {'fanart_image': u'http://image.tmdb.org/t/p/original/oNQIcuvJssiK93TjrXVtbERaKE1.jpg'}, 'icon': u'http://image.tmdb.org/t/p/original/fPHNTG1OXFBQ6aEVO7Lv8tSgfrY.jpg'} """ self.connect(pyxbmct.ACTION_NAV_BACK, self.close) self.connect(pyxbmct.ACTION_PREVIOUS_MENU, self.close) - self.listing.addItem ("genre: %s" % meta['genre']) - self.listing.addItem ("rating: %s" % meta['rating']) - self.listing.addItem ("year: %s" % meta['year']) - self.logoimg.setImage (meta['cover_url']) + self.listing.addItem ("Title: %s" % meta.get('title')) + self.listing.addItem ("genre: %s" % meta.get('genre')) + self.listing.addItem ("rating: %s" % meta.get('rating')) + self.listing.addItem ("year: %s" % meta.get('year')) + self.listing.addItem ("runtime: %sm" % meta.get('runtime')) + if meta.get('thumbnail'): + self.logoimg.setImage (meta.get('thumbnail')) + self.plot.setText(meta.get('plot')) def log(msg): try: From f71dae3d7b4a55bd5d5cd8d5e4307217705509ac Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sat, 3 Dec 2016 16:48:45 +0300 Subject: [PATCH 043/126] +sci_fi --- Content.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Content.py b/Content.py index 8322bce..1df2910 100644 --- a/Content.py +++ b/Content.py @@ -87,6 +87,7 @@ class Content: 'horror': ('Horror',), 'romance': ('Romance',), 'thriller': ('Thriller',), + 'sci_fi': ('Sci-Fi',), } } From 1dbdacfe69fad45ed53ec4ba8de9daacb4800f1f Mon Sep 17 00:00:00 2001 From: Kingul Date: Sun, 4 Dec 2016 11:12:03 +0200 Subject: [PATCH 044/126] ready to use new searchwindow --- Core.py | 6 ++--- searchwindow.py | 64 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/Core.py b/Core.py index 2644659..4d5f0cc 100644 --- a/Core.py +++ b/Core.py @@ -1606,9 +1606,9 @@ class Core: xbmc.executebuiltin( 'xbmc.RunScript(%s,)' % os.path.join(ROOT, 'controlcenter.py')) - def searchWindow(self, params={}): - xbmc.executebuiltin( - 'xbmc.RunScript(%s,)' % os.path.join(ROOT, 'searchwindow.py')) + def search(self, params={}): + import searchwindow + searchwindow.main(params) def showFilesList(self, filesList, params={}): get = params.get diff --git a/searchwindow.py b/searchwindow.py index 936c710..f6e28b5 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -22,7 +22,7 @@ import sys, os, urllib, json import xbmcaddon import xbmc import xbmcgui -from functions import get_filesList, HistoryDB, get_contentList, log, cutFolder, get_ids_video, showMessage, getParameters +from functions import get_filesList, HistoryDB, get_contentList, log, cutFolder, get_ids_video, showMessage, getParameters, unquote import pyxbmct.addonwindow as pyxbmct import Localization import re @@ -54,13 +54,15 @@ class SearchWindow(pyxbmct.AddonDialogWindow): last_top_button = None last_right_button = None - def __init__(self, title=""): + def __init__(self, title="", s_param={}): super(SearchWindow, self).__init__(title) self.setGeometry(1280, 720, 9, 16) self.set_controls() self.connect_controls() - #self.set_navigation() - self.history() + if s_param: + self.search(s_param=s_param) + else: + self.history() def icon(self, icon): return '%s/icons/%s.png' %(__root__, icon) @@ -114,11 +116,31 @@ class SearchWindow(pyxbmct.AddonDialogWindow): control.setAnimations([('WindowOpen', 'effect=fade start=0 end=100 time=500',), ('WindowClose', 'effect=fade start=100 end=0 time=500',)]) - def search(self, addtime=None): + def search(self, addtime=None, s_param={}): self.reconnect(pyxbmct.ACTION_NAV_BACK, self.history) self.right_menu('search') self.listing.reset() - query = self.input_search.getText() + if s_param: + if s_param.get('url'): + search = urllib.unquote_plus(s_param.get('url')) + external = s_param.get("return_name") + if external: + searcher = 'landing from : %s ' % str(external) + else: + searcher = '' + self.setWindowTitle(title='%s %s' % ('Torrenter Search Window', searcher)) + if s_param.get('showKey') == 'true': + self.input_search.setText(search) + query = self.input_search.getText() + else: + self.input_search.setText(search) + query = search + #self.setFocus(self.listing) + else: + query = self.input_search.getText() + self.history() + else: + query = self.input_search.getText() log('Search query: '+str(query)) #cache @@ -126,16 +148,19 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.filesList = get_filesList(query, addtime) self.last_query = query elif len(query)==0: - self.filesList = [(1919, 1919, 52, u'102.66 MiB', u'South.Park.S20E06.HDTV.x264-FUM[ettv]', - u'ThePirateBay::magnet:?xt=urn:btih:0792ea51bc16a19893871197fa927ecec7ca25aa&dn=South.Park.S20E06.HDTV.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', - 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), - (1919, 1919, 52, u'102.66 MiB', u'Haruhi', - u'D:\\htest.torrent', - 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png') ] + self.filesList = [] + #self.filesList = [(1919, 1919, 52, u'102.66 MiB', u'South.Park.S20E06.HDTV.x264-FUM[ettv]', + #u'ThePirateBay::magnet:?xt=urn:btih:0792ea51bc16a19893871197fa927ecec7ca25aa&dn=South.Park.S20E06.HDTV.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', + #'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), + #(1919, 1919, 52, u'102.66 MiB', u'Haruhi', + # u'D:\\htest.torrent', + # 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png') ] if 1==1: - for (order, seeds, leechers, size, title, link, image) in self.filesList: - title = titleMake(seeds, leechers, size, title) - self.drawItem(title, {'mode':'search_item', 'filename': link}, image) + if self.filesList: + for (order, seeds, leechers, size, title, link, image) in self.filesList: + title = titleMake(seeds, leechers, size, title) + self.drawItem(title, {'mode':'search_item', 'filename': link}, image) + self.setFocus(self.listing) def history(self): self.right_menu('history') @@ -492,19 +517,14 @@ def titleMake(seeds, leechers, size, title): return title -def main(): - dialog = SearchWindow("Torrenter Search Window") +def main(params={}): + dialog = SearchWindow("Torrenter Search Window", params) dialog.doModal() del dialog #You need to delete your instance when it is no longer needed #because underlying xbmcgui classes are not grabage-collected. if __name__ == '__main__': - if len(sys.argv) > 1: - params = getParameters(sys.argv[1]) - else: - params = {} - try: main() except Exception, e: From 49dc49cd6bebec01f369c6bd3dec86d0c9635dd4 Mon Sep 17 00:00:00 2001 From: Kingul Date: Sun, 4 Dec 2016 11:13:52 +0200 Subject: [PATCH 045/126] ready to use new searchwindow-fix --- Core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core.py b/Core.py index 4d5f0cc..6aae249 100644 --- a/Core.py +++ b/Core.py @@ -1606,7 +1606,7 @@ class Core: xbmc.executebuiltin( 'xbmc.RunScript(%s,)' % os.path.join(ROOT, 'controlcenter.py')) - def search(self, params={}): + def searchWindow(self, params={}): import searchwindow searchwindow.main(params) From 075796852883638c07240e62c13f899196923825 Mon Sep 17 00:00:00 2001 From: Kingul Date: Sun, 4 Dec 2016 12:03:44 +0200 Subject: [PATCH 046/126] replace runscript controlcenter with import --- searchwindow.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index f6e28b5..f9adf5c 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -366,11 +366,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): url = self.form_link(action, link) xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) elif mode == 'history_search_item': - addtime = params.get('addtime') - url = (os.path.join(__root__, 'controlcenter.py,') + - 'addtime=%s&title=%s' % (str(addtime), urllib.quote_plus(filename))) - log(url) - xbmc.executebuiltin('xbmc.RunScript(%s)' % (url)) + params['title'] = params.get('filename') + self.controlCenter(params) def right_press4(self): item = self.listing.getSelectedItem() @@ -430,9 +427,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): return url - def controlCenter(self): - xbmc.executebuiltin( - 'xbmc.RunScript(%s,)' % os.path.join(__root__, 'controlcenter.py')) + def controlCenter(self, params={}): + import controlcenter + controlcenter.main(params) def reconnect(self, event, callable): self.disconnect(event) From 9143cbe65a0823abe6064047ebddf4fbe229fc1b Mon Sep 17 00:00:00 2001 From: Kingul Date: Sun, 4 Dec 2016 12:46:14 +0200 Subject: [PATCH 047/126] temporary change background --- icons/ContentPanel.png | Bin 0 -> 1891 bytes searchwindow.py | 1 + 2 files changed, 1 insertion(+) create mode 100644 icons/ContentPanel.png diff --git a/icons/ContentPanel.png b/icons/ContentPanel.png new file mode 100644 index 0000000000000000000000000000000000000000..e8c13ebd70be0fb9b4026fa4bac916a9ffbaefc5 GIT binary patch literal 1891 zcmeAS@N?(olHy`uVBq!ia0y~yV1C2Ez!by*6kw=f6?h7y6p}rHd>I(3R2di=ni&{= z{s+=885l|p7#Ln9FfdrnU|pA>)84XBnW$=lt9;eUJonf*W>XMsm#F#`j)5C}6~ zx?A@LD9B#o>FdgVpOckAhB=F8);|UYwiBK%jv*Dd-d;9jWH8`q*wD4IzPEIvtO{4f z3|66M Date: Wed, 7 Dec 2016 16:31:03 +0300 Subject: [PATCH 048/126] icon update --- Core.py | 6 ++-- Localization.py | 3 +- icons/kodi.png | Bin 0 -> 23750 bytes icons/searchwindow/fcontrolcenter.png | Bin 0 -> 17118 bytes icons/searchwindow/fdownloadstatus.png | Bin 0 -> 9144 bytes icons/searchwindow/fhistory.png | Bin 0 -> 16764 bytes icons/searchwindow/fkeyboard.png | Bin 0 -> 1250 bytes icons/searchwindow/fsearch.png | Bin 0 -> 9005 bytes icons/searchwindow/ftorrentclient.png | Bin 0 -> 5509 bytes icons/searchwindow/nfcontrolcenter.png | Bin 0 -> 17687 bytes icons/searchwindow/nfdownloadstatus.png | Bin 0 -> 9116 bytes icons/searchwindow/nfhistory.png | Bin 0 -> 17458 bytes icons/searchwindow/nfkeyboard.png | Bin 0 -> 1466 bytes icons/searchwindow/nfsearch.png | Bin 0 -> 9262 bytes icons/searchwindow/nftorrentclient.png | Bin 0 -> 5809 bytes searchwindow.py | 41 +++++++++++++++--------- 16 files changed, 31 insertions(+), 19 deletions(-) create mode 100644 icons/kodi.png create mode 100644 icons/searchwindow/fcontrolcenter.png create mode 100644 icons/searchwindow/fdownloadstatus.png create mode 100644 icons/searchwindow/fhistory.png create mode 100644 icons/searchwindow/fkeyboard.png create mode 100644 icons/searchwindow/fsearch.png create mode 100644 icons/searchwindow/ftorrentclient.png create mode 100644 icons/searchwindow/nfcontrolcenter.png create mode 100644 icons/searchwindow/nfdownloadstatus.png create mode 100644 icons/searchwindow/nfhistory.png create mode 100644 icons/searchwindow/nfkeyboard.png create mode 100644 icons/searchwindow/nfsearch.png create mode 100644 icons/searchwindow/nftorrentclient.png diff --git a/Core.py b/Core.py index 6aae249..fc9f7a0 100644 --- a/Core.py +++ b/Core.py @@ -65,6 +65,9 @@ class Core: contextMenu = [(self.localize('Search Control Window'), 'xbmc.RunScript(%s,)' % os.path.join(ROOT, 'controlcenter.py'))] + self.drawItem('< %s >' % self.localize('Search Window') + ' (BETA)', 'searchWindow', + image=self.ROOT + '/icons/kodi.png', isFolder=False) + if self.history_bool: HistorycontextMenu=[] HistorycontextMenu.extend(contextMenu) @@ -84,9 +87,6 @@ class Core: DLScontextMenu.append( (self.localize('Clear %s') % self.localize('Download Status'), ListString % ('DownloadStatus', 'clear', 'addtime', ''))) DLScontextMenu.extend(contextMenu) - if self.debug: - self.drawItem('< %s >' % self.localize('Search Window'), 'searchWindow', - image=self.ROOT + '/icons/settings.png', isFolder=False) self.drawItem('< %s >' % self.localize('Download Status'), 'DownloadStatus', image=self.ROOT + '/icons/download.png', contextMenu=DLScontextMenu, replaceMenu=False) self.drawItem('< %s >' % self.localize('Torrent-client Browser'), 'uTorrentBrowser', diff --git a/Localization.py b/Localization.py index 55e5422..9dd88c2 100644 --- a/Localization.py +++ b/Localization.py @@ -290,7 +290,7 @@ def localize(text): 'Play (from %s)':'Reproducir (desde %s)', 'Play (from start)':'Reproducir (desde el inicio)', }, - 'he': { + 'he': { 'Seeds searching.': 'חיפוש זורעים', 'Please Wait': 'המתן', 'Information': 'מידע', @@ -809,6 +809,7 @@ def localize(text): 'Play (from start)':'Lejátszás (az elejétől)', }, 'ru': { + 'Search Window': 'Окно поиска', 'Seeds searching.': 'Идёт поиск сидов.', 'Please Wait': 'Подождите', 'Information': 'Информация', diff --git a/icons/kodi.png b/icons/kodi.png new file mode 100644 index 0000000000000000000000000000000000000000..46a33e140daa138b4486624b95f955a6aa415df0 GIT binary patch literal 23750 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 literal 0 HcmV?d00001 diff --git a/icons/searchwindow/fcontrolcenter.png b/icons/searchwindow/fcontrolcenter.png new file mode 100644 index 0000000000000000000000000000000000000000..9b579aeb0fae4c7f02fe761dd6c268a5923493c4 GIT binary patch literal 17118 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 literal 0 HcmV?d00001 diff --git a/icons/searchwindow/fhistory.png b/icons/searchwindow/fhistory.png new file mode 100644 index 0000000000000000000000000000000000000000..951e241291fd2a5bb19e957089c858afe1ce2e76 GIT binary patch literal 16764 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 Hu0mjfj+kIp literal 0 HcmV?d00001 diff --git a/icons/searchwindow/nfcontrolcenter.png b/icons/searchwindow/nfcontrolcenter.png new file mode 100644 index 0000000000000000000000000000000000000000..b7187f33f5f08c43dc4bd427025c33ebfe582883 GIT binary patch literal 17687 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 literal 0 HcmV?d00001 diff --git a/icons/searchwindow/nfhistory.png b/icons/searchwindow/nfhistory.png new file mode 100644 index 0000000000000000000000000000000000000000..0562056fd72e267fe719be3f626e703bed5cdf5b GIT binary patch literal 17458 zcmZU)cOV?!7dAdy?5@5kiK0HA9T1Rx;S zC-2vmW&i*Ij1A4St}ofx*o=&fz+mvT{Qn;RS2+mue-vG}|6j{%;eW^f3jbGoEnf?U zhKARIuCDI2tfi%;si_Hv!=X^9l9KXumA1CFhK7cLfx)$)r>93sO3K2*A}T6+`}S=~ zNl6tImFsddGc#^(ZdzK}>q`Lv0bya`>nc`O*6SYC)YO!fl@$~eP$-m)jEuaz{B;Qj z2L~M;9WO7hjg8IqE%fyC{~OwMFLH8n{QUf$o}R|W#%MJ9y5+T!8#iuT_sGY`ciq?j zMsffC{cC}flk@24$iu^9Z*Q-oqvP$n*3;9|fx*G}<`e z+L4h_T=|QgogJW%=;G?WwY6RJyaY%hZftA-6~x&11fY~y|E3{225Vw!9)pdmt*d{U znPq8Z1|BR(msf4fcOeM&6YxPn3;#;=He%S768qJ&-etw!R;36U3-^fFrK_x0tt9rjba(v?-xKZM5T&K0v>J#~1w^NbOUWrBgIAVc2Qg`z zNcWD&A5{s;nJ;X@lO(q@trKlR64fnSD2n=p)lGohKU96cLB*R9dDXfPf^-&%vE4*a z>@bIxed$*s)b)*fUOhrkiRA4svie1%gcquMrncAR3q+F-YhvYNR4g0~ABVUy+a~9i z6hd;1y`lvKg~0JEP|pd;ci&M-n-7v5q1SF|7i@CZ6o3~|md2#hX|UYk=d={7mwp+n z_$-OeB}Bo^(c8bI1=s#UeYEE+J)_d|Fl=u5C+9s@-{YOtym9N*#>$)!eTL}pfX;Hh zT>|=c=|-=^&eY39Debz#7m>ycyw??eFrI$lpx%`EK8&$&iQfRjSwUN%i8xV)2# z_Ev}tt^(9ZWar!TUx8gEH0}g*es8WvOeq9mR{Y=P|0lT!x01eZ;-@%wwxApRmCnhX z&SX6w?|Um#f0V5r(vsK-khG*IY-` zx#6Gh8$;|%sK0G>69JA#MN@wEk+GeMfWr6EL+$@AVVHoPEDs)9Qk|aN_#U-v_ze+&+4ex=Dj0)cS&$kpJW3(+-FA+E|o-rgeHLOQKKv z?}o3x|01&LIXz7Hb410&RPQnPkjo?-yQC&ObA{V2lAw7eT+FSqhQbWZ%zsfVX;?i= zXF=oOlLt(rudJR)7vB|GIP~#U8LYw$_iM?d3imtFgeE^=vMq_9Z2IvBM#tf@08DQ@ zsCuyIR45Khuiz9oEMbTEpKD|M_JKSLcj==MqLfq#lhW z;{pA9D+=N*qW%CuB-|M5me&a$p8QOmsXJray&dF9!KG|Y^55N;%4}43W^=OoV;>u* z3qmbw$m{}qJyObrrgEZqvq8D@cHLDKCbf!1hD~NLs|(|N5z>p#lxQCI(Wevw{6W#5 ze7&B&xHI#k-xLyzFspzgr39h8N10H`;3Ux|eEn

ZH$%=WMTO@@rgpLO6uJEG{n6 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 P00000NkvXXu0mjfCGYAb literal 0 HcmV?d00001 diff --git a/icons/searchwindow/nfkeyboard.png b/icons/searchwindow/nfkeyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a875058eefd340510976f5a536c0bf9599c977 GIT binary patch literal 1466 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5FoWBz$e5NNc-ak|A_-Y10V|F zCL!yC$ihi92C_=5Y)mr`2yGAny4$)W$S;^-wv`B1Nk@B1>hG@&M;7OP(6Z*2c{FM1 z)#&+!YyCBoBjNE{rYX0skbecWb}sT&wGBK^W;1KqLX@R z>c_Kxubp){>UZ{WhCS9Fc?v%H+0DJ~7e2Qv%KE)Fk}wxqPIM#InA#xC14`>E5NvW=f)6Ta@<@%C?)_qX%*9k=b~y!U>) zIK83YbfxT$TDC43IiQ!%1F^t%P*j4!BQqGw;SL*&*>M}jVkndbGB+?NoL~QX>IWZ8@cic! zu!?$Ul_=LR|8I1olEaQmUFD);j7y}WewtlkWvG6&VDE9pLmsjwT>XqoMC%#su6W8b z-Uw39J;d}6&dqEV7$JNkG zMu)kf3=!esYe6X!=vp0z`pYHq=`-h=KK^=p*;@^{6K^!+T>H&(KQ7vo=|1z^uI-!u zbu&Im(w?(6xp4CJr0(5sx>ic(9x0P8R7rbpaAewk2?woZ0_nGty6jiwcIkG;%NQQD zPgUA>_6PIy8QV(31cE`i0u}scFsPaRo$;_Z^9$8wadUj%u8|9$edAH?#Up)cAFruz zbiKSw)>nM(Bx^@heNf&%(FOOmoVD8)CvmlOX5{7xdZw$z!#+td)Ec&aJG?^n$d&8u zWk_dD$_ih8;qeuT8rC@jv?kw>h~s{0lfy z?AgJxV!vj?z8Sl|-gMh_-iq(_7tP}j6K@`W_;K1xqkHTzw{AwrTix1p_qJD&ey&JixH~QAb{L8xAjgYg$CRMm zI=0` zOD|hUFyya~@ky0)$XGF1Dp9ZD&Z^0Isdf%Kg2nH)x-+C)2xtGwp2WDQq4~H&vVv=a z#)Ye0*JV%GG(>E_^!(A+btmE(R90^|P^DJPxQFA&Uug#I2^p&1Mv*)M(wVH%ojSY< zkG0oEgeOPxB%I#F6)RA($tOo_LBzd`kVlCVOr&=8tQBvUeFc4h4wRwnmgRsZEu?o#&oan qOS{gnYu;%w`RtLQZhYY83&y&CJbNN5>T>pgoZ;!}=d#Wzp$Pz?GJIJ8 literal 0 HcmV?d00001 diff --git a/icons/searchwindow/nfsearch.png b/icons/searchwindow/nfsearch.png new file mode 100644 index 0000000000000000000000000000000000000000..46284d680c8a2072a5707812be61528a229fa8fb GIT binary patch literal 9262 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 UUo4Q7F~Fx?HhZm0E$Pw!2cxQ_@&Et; literal 0 HcmV?d00001 diff --git a/icons/searchwindow/nftorrentclient.png b/icons/searchwindow/nftorrentclient.png new file mode 100644 index 0000000000000000000000000000000000000000..c472822f917ea57a9ca43f4a47510c1a733e596c GIT binary patch literal 5809 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 Date: Thu, 8 Dec 2016 18:30:45 +0300 Subject: [PATCH 049/126] some fixes --- Localization.py | 1 + functions.py | 24 ++-- icons/searchwindow/button.psd | Bin 0 -> 528676 bytes searchwindow.py | 221 +++++++++++++++++++++++++++++++--- 4 files changed, 219 insertions(+), 27 deletions(-) create mode 100644 icons/searchwindow/button.psd diff --git a/Localization.py b/Localization.py index 9dd88c2..aea63f0 100644 --- a/Localization.py +++ b/Localization.py @@ -810,6 +810,7 @@ def localize(text): }, 'ru': { 'Search Window': 'Окно поиска', + 'Context menu': 'Контекстное меню', 'Seeds searching.': 'Идёт поиск сидов.', 'Please Wait': 'Подождите', 'Information': 'Информация', diff --git a/functions.py b/functions.py index 317554b..b2167ac 100644 --- a/functions.py +++ b/functions.py @@ -1310,17 +1310,9 @@ def search(url, searchersList, isApi=None): filesList.extend(result[k]) return filesList -def get_filesList(query, addtime = None): +def get_filesList(query, searchersList, addtime = None): if __settings__.getSetting('history')=='true': HistoryDB().add(query) - searchersList = [] - if addtime: - providers=HistoryDB().get_providers(addtime) - if providers: - for searcher in providers: - searchersList.append(searcher) - if not addtime or not searchersList: - searchersList = Searchers().get_active() filesList=search(query, searchersList) if __settings__.getSetting('sort_search')=='true': @@ -1334,6 +1326,20 @@ def get_filesList(query, addtime = None): return filesList +def get_searchersList(addtime = None): + searchersList = [] + if addtime: + providers=HistoryDB().get_providers(addtime) + if providers: + for searcher in providers: + searchersList.append(searcher) + if not addtime or not searchersList: + searchersList = Searchers().get_active() + + debug('get_searchersList: '+str(searchersList)) + + return searchersList + def get_contentList(url): import Downloader diff --git a/icons/searchwindow/button.psd b/icons/searchwindow/button.psd new file mode 100644 index 0000000000000000000000000000000000000000..1d49059acd819b3411332df1040c0312eb199c52 GIT binary patch literal 528676 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 z z4`tK??_!njB`8B$hWEx?a!VhvJ|IM>uAq($>VcLMJ>($+u07L+UzOkpHfS?$>)<{* zfVrqbSh*18c_RBF!bMb^|#s{;(j2DEt+Vk|tthLDXwQ4V3#v4M1*RzhNAte5t3N!dZjHPU zfe5s-)IRb|P*^f#NV7SJ%dCfc=z-<{5#HAq7Lzw8v)Z$~vYbvYsdFF)uB@)0y|6;F zfE8gDybEXvLX^*)D+s|mAvF}C6RrrF2pu8v>OGug%8IliF0ZGHmeS~iR#cP50Q>G< zRV67emxRA&D+(8p+w3I|b;`?m^pabXR?*wa26`b;GOQON&9tHaq3Wfm6Rr&f?w5%| z28NeA(McX&U!;wSPT<~_(rYkqRg&`ejfL6pKAsu5uk6jiu9rzGWE{A*y$r}rC`4Y> ztgPanD>+q|H7*Rz=zZhnjAUUPGs2k%)Xbc`T*CA#GI8?DOK851<`82Qtrb$pDim^# z&4u=v%;xgy+*0;XM5{@6vD^#%@Q zL|D*XKAl^>w<0Xl&=@jJjj@gp`@s8e@;O6n-u4i5FXZx@8q1^geJmgakjrWhQhEhF z6fMaZ9zASMTo8UrO8*wR5J_}0X&Qe6PU;?1CSV=YI3$YLvDr z6qi4?tL+9mL|4)Fp4xT=Z51}|WmR3D))pInISr4_hL$n(>S8gP%l9DnWhhJafa=(D zJLKM26rrtEG^Vks@!Gb=?OU4uzo6)%$6ngmI>#i(==YY_&;fiRI>oWH;q(KN8heoY*7)q!)>0c2EOf!n6r?@8@gh7GjhvyxY_sv3oBQ$;8gD>h+2xPa#`mB?wegJW z?C!=-U)(h^Z+w?ER&YjbEK+n#azD_z__3!iW`PL3U2xv~&N9uK&Pb6rzYmA$-E zmJpiUUs4uJK*&Lm{g15utp^1&lO0?(B{G+>J!n$hbyaUkSK0-a%aeMcAGONn}rO|e1mCWcQ1MD^k3pQ60wNI zi(HDCe%8U3gCi-P`No^~6}2^AM~XaY8Y{oRK`LSmQ5k>^9$ov}elk3YCsgN50zCa} z-8{$$3a0`Y0_z})NbLhe0XW>yfs93X^v+NFw_5?!z&rRJ45@_06Wo49-origfG}${ zgYbxYDPm6g(V4&IYx!NamgP86nKHl4_8-D3W{u>gv#{jM%Ezns5u@diyBC9f0gLhI zKMd_y40N!ER^uCd9tdI79@J^bE7_IY>isp%Dk7vD`jXHWcVCaK{dDJ=uql<2Qon~) zDPwbjn_h<-V!ho*=$Ty+5qu(QLsy8KNG$T;k6~V$>Q#?>rMwjS{We*dQaG^5rETEI zr;hTg8J6KAIYG=tl1WPdi@`MSE1z4N8Y(D?uNMosAlz5JO*4gXJObG25Q*RIbCOt~FJU+Hjp$q~M{Z_~SFtkIPJl5I+Z9e-QpcNyVq2kT<&etKZv{p==qcVhI4XYE$EVZGY zxwn24tHcbCTP}|tRn>kM%d|(;1Sw)2p_sI?4x!b4^XM0V!uUqts3)j>BRmsVl}Ber zm?}2U5z>WH4w1j|jqhB9$fYQbVf}f}>##@aS*A)B^|`jyCl!b&bl;R19jlw2JeGt^ zri^XY?~v0dg~V#NFsmG7rk*kHf-Z{hWit12ynD(Rse9xX;N+l#lf>Rs2t~xyJ&6rl z`|dWeDPlmS4d%9vt(b%8%sL?YJ-l9w?3})#7RvE?c}26N4uPGqOErZtNHujZ6l{1l z1@hU2?qx3j20Es1O8*t~j0`wkx|GhbeZqy`rkgwx&Ap@>2ydN7$D|sZwh!r8%9P#9 zkZLmb){)VZ)T9|9x2imL=l%bOy?2kQ>PquP*WMdML=cUdRFz4klB!B>jdV_*cAQ&d z+_Y!hLv$Qsl{eDO5j%u75$q-?<(7?`07?Wgh7<*Z7@rMV#8y%<(IjHbi2(@}6D1_j zx=SGq7O#MsXjC4;-h0h?f8RIP+7H~I-Sy|aWBcH-*7y5f^P6*iYpvgcQ+Sdv_VOfG z#d7`=&whZd7wH@55{+GA=uFOV4_P4@tcQcvo7C`9o59!%M~))6DZ>8~LPq4lnAGOet72 z&FXJPNNHA~rHATJQLD^|>2@JO;-a(}MHNBmHnh2pUe%N#Qbt0Vdz6Ea8noK>we5~^ z4$pfeU&vu-gDS)xLYvf(fhV4!8hEp$KCFe5=XBo>Vts`2a79IcTKy&M-|GIs9e*W|E@#4Q*wqL@lr^bdT z8PG^Ynt34fTLga)(r(DvZ68CD5jfN3Xz>0KJ-ttn>;qF;Km8QW82V0X$fyx)!z6^b z(K@*X8*eHbhvb|=62z{e*uhBdl@4p4lA!BoP!3+EW+&-^iH=2xn>Poi4zVI0T={{F z3oL`<&w*pRhUi7H@t;aO3eEyXFzaA-gqV45x(6e%+ESiIe+!;AB_Q;ah;+GvTJ4`H z5%BKNfT;&vE%IEyb;FJMW(pf3#|GtGM9T;l$zY#Qyau(;A)`?Wcw(qu`4nAc9=bQw z`C}4gX)cnF&*$j)U2#)8O|Bp>4B{1CVhE&pxJKv3TzKn7_z2^FFK1%}sIyVo*^%ZY zk27>O>)xl%MrR!c3|*HaVW_cVSHG9{jUWg?XLDZ>%HO~X@Nha^CZg+eLp}Hh8#HWT zu3>u&5x98dk?0HFcNrcWFM^x?*YTP@h`1@ectaYlWx|YZzO3oJs$IQ_yr2tcR1Ch8 zVIyRPIC2jSWn~6Mg1o3fm1dH2U5-JBHiSz^BbPBxN{@yK5dE+*4c9m=a_l?#15=kk zG3I5jFCnDy8m_2fOEic?ZPhyItxN*yjbYh5AgxdWFE&0h3**GEg*u(y<7JI+#7@nN zg(qFK(=K>h!=d!Y7ry^ip2yY3{#N)w9Eru*GK@?-A@?jyFE`nJCB>B{ySO`jSl~iqBoA`eI2l*bzthh0 z`4?owfXcBNvCq3l?6cK;+KGo<{*16)Zfj++vSuckU8pobA*SHb_1be3I+vWvZ_4{n~cn<6quJVIju>S%auS1jBFoRscc0dYB0#aZ=bCHyDB!z_F-XnKm zR7rU`Zs6YsXLNq=mfzq)+2#HV^@xENg65DQQyqB3kkqgJi6otsQ(GYjP=)z!$E^Iq z!V<`Wu#f9MZSMRYZ^gqK9wDx+wfP9i6E*i4^57(jtMU?O=Kx;RLz!__PQz{lc|+Q# ziDzV5)Eb8)-;^wBZ1t@d`Yo3`#rL@4Fd{F9_qScBZ~k};(&fH;l)9$jq%Zle5AWF_ z;r}KhTVXdwM%pvac%PO^I)oc~>oxLYS#NFq^n$xhUWoX#6@ouL@_~{q_uK=I8D8}( z&o?!EgE!$2Kr1|gr04L7C$%TUlM*N~X=`8sOi zuUY0-@}brmH7z0vk396yBab{b|A{A_eER8UAlQ*l>XwvS%3s&_c=uUq_IXLRcOM?k zcwLsyA$2*sf}{)Fu<`FK{Y&}K0Hgz)Q+VEe^B#N%^5+}!0YLt+0z#CF*N6Au9^-OZ zA_`~cJ1FXu8qIg<~#B~WBDn_we*{@GLDWCK{eFHfS!B5EfQyzN+ z8j*kK)|@U5${9KRT0L)DloSsOVVx-YkImQSizhr!-g?^eq<{$d*i@v2smM94+Yl0c ztzK<@l$23JikxSKzqCihWBUBTCv==H9O2-qGfT z&3o{{haM7-3_YelA|H|uYB*nq4PR-!#gPw=<2k}2n z^1@46WQ*2koEUqJmbigi}L?{mj`B2R1IP%503GxeFbzMTI5mfvSG#?|53(zkEeH%b7kBijO1U=UB)5b8i$xzbclbgC0L#B zjAP~+NI1q^kMYv-669RPF`tSvc)OXJ(ad8oMX0%k4!Wl74si^YmpmUG(7sp4{NQ#u z>V6k3k|bT9SQ0OhzQHj!lovyx@iBck2GnJ!ry|jYV3|jb>JxX9gq5V9Ob#=QD5UI?;Ve7 z$5A?t!U}&9?b~paz%7E<&`xsH1so;mM#4`gJL)_iWt|=0KZ&S683#Sz|HZ^Ub@?RG zs|#-%3(E25a8MX}8GmzvUI#eAL1&GFW}m>j>n1wr-;9I)`b5jb2eqn$V*eWNke^Ue zi|?R+oA{uwa1dRb{OcoUCqC#)-$8ga-b9Kw8wbrh;+puNFZdu_C)h5BE=+t_6CZ|l zcfJ@NYM=PHGkhFfeQIu-_^8u-6dIbpZWhDC9TOk;IUg8-Mi06na`58BM}CGQr)hMd zApa8X79HxE_|Q{06mt*`{dF5!`;#2`DZ|s1q{o1-4dX?D6FK{jICMG*#kB?O-sSM{ zHxnP+h=Zf~V6@IJ;pidUf;*w;PjGY$wdJ_~dx^G>LzgE$ya9*96J#GcqyKsd+r7bW zCqDcn4wqUqYyQO3&-^RN|Ngs)kFUq^Fcim=I!~wl>xC;5A6&=6W#lwg=ILkF{PxpJ za3uPL6I%PRaY{6~5^L8qM`87+7cSw|v$!E-!n01`ETR2C^#ozY8b@LIo*L|0F0}Rc zi%XZT=_B`EnxG1N#OKOLLL`%(S(A^G_lX+M$Flhctl0o#(BCn zi!jkNho(5M1lzirnqlnXcu%P|#I)n06F%e*(?W4I1rW20i z1iZaGau#cb6JQtb%CO-Z+czsY zGB(CIh0noi9<%@@df^PUrB&N&(yA6GxcP)AoPZsS+5?C+qmCHb;~CpDI`k;Zj>c$% zm+qVQ5Hxz?Ni4aa8KYh1(~;P47`xl|apWiqorV>*vA%wC*xWm)1bPx+EQS7i>0=B%spQ`7Ou7oBJv0h7~%uOeO9c0#X}yf zeZ$qtoA*BN;)t7AXJb)&pBIZ;TGhXUpIyh&_a?rk)%9U~|DAR%@(=hQOVdcr9eDs> zw&7QY@IRh$qNhjZX+OqO3_rnh3lHIWhF@y`ji1$s*Pg}`8cXpE#y@CDcrN34d{%1D z;i-yr?Vq$4wBKl}wY8c<%f@HD=EPU)wHLKKEmzCOCl?>5R*3I6XfNSYtd-!&gqO8) zZ7V*-+GcH&wnZ!AuL|+iCLCLUpBD31n{dX<_&$%%&w)HAj>(6t4UCnG-)+SAn;@0W zehELP^9d;%U*|!Sm+*bMX2&N}%fWARamEI19dypY&or^(UUZPt383wFF6kXReKCil>8NHBz>PL?ctgBOuIdE)E<^qP}S%XHj8GXXHLS;9j|cW znQt66k~xxTv1bn0Z3R`w&+!rT_({0Scf?SpH513C-b$9Kcv?U6Dh{nU?$T}aNJ_Y? zu?muIX37jpYI0cOk|pu+-Z*W6Cr-vsU6PoXoSKno&l& z?zYQx*p?y^jK9m(!P}OX)=r(#%M&XZS#$+TfiC?fFE`DiB`uYtU z3O$8#gIF&NArZ?HLCOQ8bjXi~F2h-2el_@+nsYS;!z&q-JJ0jgN4K71Zpvz%YIc2S$x#PRmG+k6RF*n7(1_Yh#uA zYXaiHl@cIMEDu+Ti3L+24k?y3<_yat``E?&z)nMB#YpB2}D4LIJwk9!Li0CX54ayXKh6UA&s5^vbi8_G&2IG z;`#FQt(diI^$)Ed96f@r^dWh0He~MHxqVv&WNz6~l%H!~o1U5~f~6`Qx7OsK*-ztv z9vQN^YMcbJ=^r<*k|&DIC1}bM~;BCjRpI3X2EMs z!4XTzZwMCT7Lr`u#t$R0+{lc?xVXd(KC!Lt7X35rgnmN4H}A-yLxzXh8LTl>Uhk7^ zSxOqmCua$#HP4wRoZ*mfBS+JtOXTQGVfSW6BXIHQr8PCRCr>t?b&a)qTjXc*GyTK^ zM@e}+V~Zeehf_+(;ROVtFa+FUXrE{oPH)~6rvlJz{FoE+!h=E=l^P$n#7-ta{Ajz@ zrMK&_LY$b#^8Lh*S^bImwEBx3FHKoko$gOF$dh~-lfDU+6DjOImD z6p@!~z&Wg0T~$tZR+Jq$sikB@Q!Culb-h>XlI;(;TE1*L1uEOnz&dN-Trwpt4 z@RWfi``wp3{i64w-mb1TSF7PeGfIYORHNWUQ3M{9T+3Rnevtsfa8GpR=X>&O6-8D& zuXavnu&N@3NrRy?Jz;4F<>2`zO=q8(_5PJ9M9Lc>$A;A90gcfX~#U-mxS z)v4^G$icpMXe?E$l0e=ZZ{f6*Q+4E3P>9)#4~H>DuhFG>W-L<#Kd*T z#X~1feAd!pqK+}D*89``Ub540Dx>lsgI76YR1n1$9YKsniKZIOpePeCb85x2n#xOh z%q^_pc%j4TbDCo5Fg2j6Jmv96 zW+G8R3PsK(JGWI3EEtl2DhpzA?S`RPP{6q~0JmlUm7GhD)7cto@*H00EXNCp$@bFM zD&IL`ppv070Q4bnQoA@|!S{rDl~8G>W>gGFLe)!jB$Blt7fXOhco*X%9;05*o94`W z4HGJ((qniSjSi0!Nt>7sOaE}>sER11kpQOWlI+)e8L<^+HmU)Mv{l}v)xmZJDcDk3 z6jP9|3{8yZQQ`$8>@*_EPv14vj5%kdCZ=K)wBJBKhum~MKylaiQ# z@v^%9`(beaFopMn_b88*&7um|QFqGiVw+^61A*D*Oz=14?(1w$*VLHxv_mRq9y-d zL|Q>FXQT7H&d7o-Xk>7T@gtZGRTO8G$Mp3j3Ks>d?o?AN-i0IjZvt2Ao!;ATgqaEl z-m-CGD!ZGChd3zri)yg^vA_Mu(OZhvQ;JcBEwSf$oRP0RZdy#Y5~?9JCp9s}zP_Zi zV&|UfgNKfQR-1wK{-H~53}X$Ro&tMK*a%qs9?e4H50Y`sIBVNVpCgCw1uOMaZT7wt*&( z@PIvWY06qt5vsNCyhoWx(QvhqDxx>6pB$n?6|G&iY0yP}X=(agoYERmgX-joFfM?& zZ|oh7wGpU9Dljv7Spj9Bi=D!z=~^U)+xZ~UB4wSS3neC1q7UmD zDK@R73|`5i_2TuUow8j(3mZIQXhGE3q=bx?NqAIykD`Ol4RY46$P5)7BlwQA1C5 z81?F5NAl9;nT8gqS$hy3@(ag@9ph?iy9H+mm&y>?B;gLF#Z+bwC4cyn#8l%Rwe~D6 z<$R?Su{)uLwP3X`ILaHA#zK$tA>=F6FtdavXsAJHg7~Nax%4)@9dFZc;pGEg$^c(j zp#?cZzK13joIwLv=lU)7%;KefS?PuihzVs#CMjWYuGWpgYv^zsI{cW*m(rnt%QwdF z!9ysb@C7S@0pfDEd5{%&0Vv#H27?sPKhTZ}p90{#HO3031ugo?4XKGpQ9}WtP30Pf z1~i^!LNTksuze6)x717uM**pT*|Tat{O}%hXi$#OTZdhEZ4O+Z2WTL{d#`^G#)&B~ zTJ=BpHJHhPPzt0kWd*!h(|t*4VSKBtp~~z0X`VAxDZqi?>6^w0oWPM_FW`*}URM~( zNGo0f0sht?HS`aq;fP>0W*U2uG73aGax&TJ$+8w=yR1#&BFYbC+blU%0!zoAks9gn zgUScga~iIOBajiNP{*3S{Bo#OYt^BE_}qG`u@P@NtV6F63J8n~++&JV(6Nr8R8ULh z7>tXuLJGukD3Im!hSFevg>XKCW|%V>B$Mf;3N)MVspgy{SC9@!%O>&V2z0>P(0oqN z`GqhN=_oKLgprOkr79hww^vjYk`q$UR?DIRVb8-%5$yw>X4PJg#P6yRPaItT|ux^Q9FFS-eTfNC!~l z!w&*}ARVYa2`-ajzh;CYigehpo^?PVSPAefs?{Wv2!j$^k&QB+isU#is7M?_!6r9Q zJ_sl=W+>oyg21>GC{3zPQ)yBPkQ281@H2rQ1}D(##ni%zp31d_lLC2pBHu;|i1Y`| zOen2DI&vJ~215ZP14TlqpnqVD&94C>^Jx55gLxFTwon9j^c$+9wBK zJ7vN@5CR^xiSvL4r2stMD1{Js8D2Da5duGa813SCbtSQ*QSitDh6hV1((rG+f#!!H z3-j{yd>f4ek?w~t+h%0pAp@TCQ2$&4-ipcGi}}H0j0U`v7AmMLkViBl3uc-d_w8E^ z4RFbfHP98`Cdwj3fbuZUoB!i+BM}v8JEbAjq$5Y+0a0fo50DC8yw*&I3Oc-CIfb!c zsWbe5JKuSdA|*8VAyz4|b0_OSLjf;hATO{E)TLk@tkA)e|43eN4*FEUTXQfJd`W;P zm^#paWF6d4KwvCT9?&dlDlmf;VEhf~R1FmVqY9sj0r|jc$*J(>|Fj@KHE0kh1ymCH z!XO%vcSr+b(8im2pa5Kg)qn@bCP)y5%o#2-~CnT(IlT1VKy@U|K>&kKJ3 z!rjBu8_FZTY{gi>KLWF)z<|KpsT;>o7U`8`N)Nb!8Y|S&soGOYYG8Mhg{v~tZ_^^o zVyh|4_ZIv-Yho<|^N^e%s3x}#F}$1I;K9rwPW;HXrZ>;vb@@jd|hE=G4? zVZbvYE#pgqGT?S}(K^U8BbhE5y};&m^IWyVV!NwKVfOmv*jG+~j8U+w+*9yqK3X^d zz!g*g%;XP<{pXzgqSf6hTy7ZdX(GcVz-dQCexFU-Ot!na>NNsiis}oOTbzr$RC{<5 zR<*}gRDp{dn}1$_wiT8lv?`>=0%LRWLH+a9UrKv&IiigPnx)ls3#&74)9B}-(b9lT zg9gXXHXA%_JE7Z`#3j0E$lZpGrC5Q!`TuxfDMMocf^8F^ckWSjk4rCC9bN)pF@z+; zig3_12D7~|TRWvU;$5{c8?dy6Q$`aiXS>G_OQnt{T#JoSAD|>NW*bJ`&ZsDLRB5Q( zT6xALdv#iYxoCqT+bynkuWJ;GW4AE{Nj6)4Fq54QtE&OO0pU)~^4PU?xQ9wXPeHZS zc5N>3ZbqPe(8w>-U>`KEIE-}{L3>=o?H&%bs&zJMC}4zrAm5AOYonEfh=qR!Vr+G; zw0HuiI0?gdl@lytY+6jPD!XW{7ns(x=ERDZEtc(5+uG4u!Jjq{SuWst+7<|!cJQ_< z=n%tZAKXtmtWTs!hdUQhb@44T>NPgKsDff$vKi6#P4Ya)af%yC(CbrZxyK7%+6CzC zVQuaB3<4W(B1Vy+O%XLPV=2*)<_a1~mJH~;M~TMT2TeIHEmqB1B{u(}WOGT0GbA|H zSd`-mTsgqosw3F44K0-RwyOZw6}akL!0u?uwm%$%*@dZywc8%E4iyz4_OI^3DdN^$ zcr``IPvLu?)qw*Wi#r0w)(b|{qz2EsD9=Qjw|%73(%v}=aBr&y%Q48gLBK8JKUBW< zTIq&l3~VI1bEVLx`Aa$yUD~E#ZY|oid9%0V;TM*suUp6Kd#vh^=SEQ(hmF8u_lXa% zMf=sxF|-9}BRrRyh)6lQHgFU+6YzR=w=FiL9J>FxXuZ;bO&3&aO10gCHtl>jYF zq=l}L1Pd2N@(;eVZxLr0RH0;(pJ>B2;qe+LB z*nLKy8gZs5Bgim)E9S}!uU%$Z);%n=C^Nf&NyI4FIA9;QtDL|ev@g%3?IX{XMs}$Y zh0$yzwxmhJWd%05+}l0WZ@tuyOB1BPy=YTn6~UJ@`St>WM?FjS*ln54WhiHXeGD4W zQiI#^VB3QQsi~Y~G)v!xOm##wX$ZIOqLkKw>!qs$o=f5VK<}rkxZItb+io`M`ThpN zFU6?N@YusL^B%T91J#G6uGUl@)ml|KEWdw8`3s4eoN&}h@$FktOvrTfIeiLP(c~f( zbX*~rLg4tLUz$o<&^NuJdu}JSYq@7nZ}NGMy|8paBBi{2l|UJz%4RA;F_4xpT*}SZ z*xepHa0`X5k)URsY!VTA3ur1g901_g@7oKAK{lX0g zmxRmWGJ?TZiwJy>JfOf41>@$E56ON?1e#dkfZ!kyMT?OQk5`ntciij5#R2O4`gYD- zc~0QHkXRQtnRTZPO;;UFV4wSKc<1$%F~S%9v(@ETh5sR$z5%6{Ot-G1JS6{9;bVFj zuJM{>%PwG-zW~Fjr>LfNwT$`j#0gZrMif$@dr{rPkcGIf2fpWl0K=~c{6z%tmle3D z8_tLCsT2@=X-eD@RR+j>zwea-%J+{~d3MOkxto{c$`Ez*RP+x~l`B*Nyl4x~f6dM%KP=M@<8h(am;X#+Ljw`c$k-)z=#}^GaHf*; zsf(uOHwyd-a=thfMserq&F=sMUB47@g-{y8VDNo zcL@qmq?&mGmo+voE<;ADG6d^)xGV43oUxV?&-DB|G__-O#<4d%uVHG(61H8zqY92* zvRuJS;oU%vRrl+hIz>jmMw_HDyG<27Bpi27nJ~u|K~>+PZQ0?e{84pf0X$9_x2KA2 zCWn*9QS-$qU%Wv}z?irn=@PE~Yq$pQxnjA*_X^GE?WTc#s*wyK<30cehqphhi5dHrht~JJD3{$m)z;m6g@NzHdiXYG}J@nA5gg&`ih3Y&EV%n-<5A#kl%Z zTT`8X3iu}Lq0Ds)MARMdSLMsSgbu>SnjU=;eqn3wM8WXArAER6i)C~tlF`% z0W_{I;ewZ-NtS(1ey6{b;?c-(WLa%3MS4jFR?XycN^dOXl-b1RGtDqNBP|a$&puFn z;6S<4&Pi59mrls#=(QLHhQkeh3E-=MlhX-()Ig>?FAU>P!r|-UQB=*DEjrM6i;ekz z4CA+~e5KM`tsj_GzAl%Gn>n^oTF`4jVP#};xoNkj|0-EYj&33-JMJ?Clnt?cSVsl( zSxF2*GnAEER_|`8Jy2bJfS^hoc5cQS%jEZbP?$cxq#Y=msIiOPxUqu`>uhT}d9wDk z6x=^a-Hj=k_Pj-KDitj}2Mue~9V!A}P1UShvfu7<)mD!km{abAUFNvuHk&G1lu8=6 z8vT}Oy_3%)CdO_AK0~JiSfw}+-#&d@Payf*1Ct`aWK@t&7fQ%mZaw5(O*oPzxb)AmaSZw{mR?z zUK4ZXfs%Fh((Pswo6M%cDjO_~rzEX|2-HSy#|EHV_7381#^^3K_)vc0l8n53z(zO_ zYbT>hpWAucMa)WJ&Bg21EgqU5wm7@xDkw88S6w4--M1ru-3Hi7B?7PSJ3`GPH7D@u zOPOkpRNO9tkEdTJXfpUvZt{}kEYMcqcD5-FV6S>OFyyK@5hGJLu=9SKKe*Vky5SZg zU3=@Tnbjq@>C5M3TKAE~S_3wbr^3nLR$pp+y4}4o-CdpS6yQU-Nb0--Jm3J6!yF3J zO)D+mEuo)j(-?5yyG6^EEgo5Bd8OSzoqJ%%W`e~ONUeI+Nr1t)ObA$WK+$ZVce=Z0 zbm9xfEJL3;E586eUw~RySz+caBd|pE6xsaBy1ae+-fcKt;aN7e((+1|TZpR`SN+Ia zv#ZNDQ#$b~$LC@g$}1g0r0uQ5Os{o%G5<{?yblR46Afl>KHk^ov@Rn+B(mDRb4ZCH zDhgKqmSF$Xd%kpVrDb=&F5FkO`cWFl2P#XPh^@K2qC7r|9@Gh36@{U+y1nI!YBH@$ z%s?mCn;(vgON$IJz8;NIPhq5cn9pd@e!O9Mu5@IzTsdX+?n^NBs@Em2TIy@ZFot7y zY+h#o)4YSEvQbu1%~Ct8QCy6fcJ}1S5BI>##0)3i!I2+ZpVx?Nk^ zh>(gR`rCc)!q&^fLRxCGhk+i(;JQnz$IS@!p0_Lq-truXsVph5uisFrJpPA6k?$O# zD>9VUdc)W$G^Cp3$*Hx6%GM?)CcltBO2`GsToYOCojI9oHX^bzpc@Dp&(YR;vn{K$ zy{iS_`^8n)SiSa^K=Je(h{dE^U0J@_v2H`5g15o};t1RC!DyCs*3WTkLhaN;W%ktM zqYtWi0#PbWuxEHTr^DT@b zWjX;HcJqGGc1`;du&1KhfF{7H9Yz3@V6 zMwSx;ck@s|cwyc$L|MoFlU&S~w5((;Js;8%1dI1mTz&&@KSzvZQpB(079=@QXGX0y z%fst-xvMRe)q166N2Pa%1Oz*dN?62Q~Pp%Jl{ z-^lBD35})a4Pp3p3ee`yPkPvE9kWC%TDPkb!L9ZZnrFvo`Dlq{bBUV)+y&wJ1%-JE z0<}TyxBO+0D8K?xK;LKWdjlYN8*Y*Uc?#MMTWpW6E61M1v%^wOfAHq*5-<<}W(3i) zDF82Qu<}HTeg=CC>m%X_3k3LHTF#YHUJ67?E|BwWPjN~M%?stGJi2o0t{s(?qdT;6 z#&E-N=<#|Gw#{Bji^76+%b<~$3Y{{B?t#G5m=qym6EnwQYwvZCv02ZRvMmbBvS5+U zEf;FwgH2=6x~;p$$R0P@GX|eAj4ZU~ty+Ya;3yEX2|XHyp+ZA!V}U4OrxWK(SFY4y zk+wk02MX8WLEi2>3J~;ByybXBc}cmOd^QGCA_@zDflPA~2o^bP4SIhzE@s3-7K{-t zJi|aCw^`yA=<}`1EEtX&7HhP0A#=hWUbM1st6nZ(2~a$n@iyMgQ-QN?*&>S-nZiKI zns8WyAo(7}JMRxt?=biXqk(q)@|n_=NlCv(uIckF%Z%uPLPZS>f<&v}(M8KvYC3mezcO<%Y50#hLIbuU%o8foaUti zc)WOF9XJIDmwP^R3c!So*v%#c6U{b46Z6A<@f5(k=u+^07HABH3sXvgQEk{VqOwCJ zq>WV4As=;sSkC+jO)2J!gg7sn!A1-nc zGjt>EGCU_t9a3P`FQhSo%&7AX2E-ofTE2AK-2Uv0>C8?r&K2HDv5 zKn#RgzlBicV-NJDpAxOwS9%JlKoDf;_|L7TQ{tQ5%uCO)ijJr&5U&gJ!A= zjG<;@k~hTsdm6Vy@)j(~Myd%^P^H<7U_nYX$vthl6G+j(!AZU$bJZOAIwX*f#;Fq2 z&S8=`8rE{9TJY>J=`;V_oIq`_1*q4oax&-(dUXF@3eYBZ{+G}kNgI$u251it{_pP6|F z2?HP(_}-rpkbpN3s_~A;?vxkKgz&-`UCZWWA=M;BeHW<5H8~xIVCeM1lJn=A!DYu$ z4fezsT{SeMC~7=kX0awD1H*=7{Hggo$-uxF7mq+0iaIYaqlZ7-!(G89hB0UjG zlRy0l>nCU;k478QVMrm0jWCLuP`q)*>g76U$fmG8=u$$;tTT0WM~_Y>M3EInHEanK zVpfp56{5HdqZ$J0*mYIMkZ2?XWze*T=cthOD6Ye44b8h%AK<#@x}3&iS4CJkWyaA1 zG&7(chZLf?5F;BJcN>XjD8dO(F2UX4Iaw+05l= z3&S%Y^?f&kz@a;V#~hgKbY^+v(;Iq*g0fJY7Im={yGg*A{*i8(sA~8cobge{+(E^% z^={5*W=Oi^U(?XlgLj&%p+pIcD68w&>!FfLv1O8t^oT8We5PBdS+;6j zUS4)uTDHF4mc~1;z)Un~GJzFEx4}^B1Ano0_n`F^MjbD-KHUMUV8xHgSAh-SxM_*-qcxfG;N3svP*nJDp8}u>Op4)tj#PAM_>nO z5M82O!AGE3;noC6z&XNZuv~J-!Aord2r-&o2EC`w;CWuo@K@Na^)1ay~6@!j9!^Z(%g zzvB;mpJ;rSz+cmEpT^%`)W&RJ4T>j^&Ezja15~j91Wj$+B zTb?~N0k!3+vnI9W*$~v0XANr0Qz57=Pc)mJ*hfkg#~ML2bEsYC=*{N*bsw9iX;!1XEj{ zGN~=ok`fjh)Rv1Aa5#>3;Al`=I>POatu?1GYB8*XsV!5IaE?K3xj13P3U9htArlm} zC8Q`JqY&WdlUL_&l!V0~1zWr#r+DYyy$3x9-1ytFo-esN=OnciTECEO49VWgtSatomHQ4)Rr)cs4Y_#$1PZ#UcC2k z-B=Tzz=Ajsyab37_Hd;bQClXY*&&RnEny$K*iUUaGlNuHY%e=@x~b{wubc3}!w*do z>pSTaD_KjCLzJGZC6QYur8z)u=?Fn?nFfgq(s$N1-TGRz&uBm2+S=6gS!4Z2A00Vz z_)rbF72rOB7~obaM8QJgu`W&`a!W@ja?2D1U`6p^@wMlQ{6_XzyDqllE=QOAYBr>P z^wII!_aSxv{=Iv)m6a54+$e(ODlJ3PTauy)#fO`|*00E6>o=Es-5pwoX#XMZkXH)V z)*e0t*?afy+O~~k=Rmedw<1tPZ<&O&?r(W1X@? z?~o+@E0*q4oTZnT(j!-p`w%r}4u~FdY|c%$6I~|7#ij2(ZHn%5cj%p3ho@s6-A}H3 z%}!y>p?aB5xMc-2pSn23;mpY)n#-JUNT;RZIGRg%W^wVcufM)BJnX&MH`eLx0G&st z-toXiJfQ@LMuhV?oKr)N-$f7#gQ!{~lmSV0kpmvR90d?eb2&Y2aa=+f836J9W1U(z zZq|npqGKKd_#MOmJ_JfZkv@foWCHPA=H%t%<>lPYb2&W|2~GbC_+*wfuXRs;c2G}sJ6qM<+xN0d$pA&D*>QFh>LJVr)b29E5$ z-lq|lOajB-HHq#&|D69 z`y{@WfRf$!!lv{76n_7(k;Hq+C<8YxXhm6NLjoBwG>F5 z@E!@*2EcJS05ofNAHD^DAncm$kCk#FgMq0+ft49xE2y@lD2mHX<0&oymX?rI2C#NO zbugG5FeokuEPVqKIoPi}`2)7@JPo4HR5c)1j<;`Gj(r8n_u{lr43}psM7EZrXUAkD zB^4nF+u_QN4t5_vnc;Fk>$45?k(DZXvTL@H^KdEWiVC3EuOoobDAH7=858v(6v5@D z>>O|QOnXXF(c!wL_KSv{eSHF%!UUIyA&As~r}vmP(ik)FP*>SXkS76fMgSm(5cHOt ziq$sAptn3#k*(*5>?vsp_JaTv9Z|3mp6%-!7%=E92Q&-^8VDE=un*b!6_qAsVD0;a zC~62$?uyw~W>|>z1e^+H%N#I1staKzvt_n7XIA!_q?EE_b*IlOr*;BQz^Tmn2t3%x zanyV6LmV%*6DCa@jENCQn0gJkR`yzVZNuyz38!L6ELOahIeFz+r(t_&1BEB^T4sB4 zkf=$;2kTC^!l@ib_;A4BwH(lar}y38+tbtA(`}R$CzVqO*Mn5R|)gZMT2~gr%npo#&ISW?yP8=&BdUN5Yj%GS~V5?|pN{m(!b#$NWr&e*?q zC*>5SRDwMZ>tttSc`$<|kDobdNjYUZYYx5tQT=CMx!SwPRLY_OFj(@4^%{^7Ftvlm zEFJ-2Of#}tt&Wt6p^3(CXc|^J&S{Pi?3L`^l=O{ddjNX8{<9_p$_^F-mP?pQJv6gf zp#@=kdLj)k2Vs-FR+J3!{wy`gnbyW7Imp;)dE{c1$_8;Ie0(o5s<>?Lejp>MfZT1^ z>lpxXCA=&cQ}*ETAv3zLnTOF=*o1wiH|ji&$kE}vc-SM#B8oSrFOFNBnFE&4@uZb- zvNvaLb{e*;yY}wq=%Q2^xOf7$?|WD}VBmTXS{gs7*MXp39z(N@0!fZm#wNtYrG({!6RG#^g7?c`PHif zUG!mEK%oSaJ$z1PQ~e0zx`oFf&lBk&MOzq7pUE>numN30E>9rlNk>TL$($b`)H$yh z(3ECI1%cc3KJdWy-SVM&j0`g(?L!r)T=FBJ@;Xjg3|}u!Bh*k#lNiNw5$YES7AB)` zHNxHJFQRhkK)nuBZ=cs^X^aZ6$}i4r5O`pAAkMe1GPjn*JH5MTLWXDAmdThkF-bQK)8(?@b* z{V+Rag}unYMD?hLkCm~w0NCq+gY`Zgu#{}xo~e{nTt57vHF57zi@HOHIH@SG#24uZ z#TU5=E=E!T*NiPqgurd@5HR-lr#*vqrElu%$TL_&%BS=c>N=VLF; zMif`#hjfJCha^m7(~Amo7gtJ*qpw`&;b2ei_kE&oEC5gM(k==gp3V~zRSga*t(D2j zjY-HO11}UEWX`=Agh=k)MTnS=8k=Bd$3-1xUJro8KA=bM3ZuH*E-+?5s^Ej1$&OWs z#VZ)m>j=sJnDfKDoHT{Vj^zoEvKL0ev+mxTeX?)Vuu^toSz}lk3^~(SpdTiu79)XD zoE}GLu174cen5~LVWf&BiX#me!%8dG|K8rAKGervD@LumN9#r^bqS;{h*6Qc;6UME zs`XS1Qupvd@~s`P^k#w(xL|n9xgTwyoRk&m8#kK3H1*Yg##wZ+OYgDt!rl=8-(q{+ zJ)rCbutZexei8tyvLua#T=enx-#R1i4c zj;j3ZYVWw{r8&O`vF+>a9r770U@+lQk-)=pT>mx0(NToEcPHb*%?ykSlxigfbD6Y} z*6jK7LIJC6Zok-t8ra)&6QHKCD3bt1x6fB2K#2iRGWNI+6GV-UFc?c0M#m8~!pC4r zBv7$&jv3oS?<1?&$uJk7l8o#b?j1C6(Z>X?yr=`$>YHgPtEOYi$*{!A zluJ}C+Ao@xj?gNyZ?MsFEL#R5}enQ0~@L$C$)Q>)5P)cBd3s5E~ZF(3~(Jnra z7d&Wun0PK43CtmtJ+~P1CSeZ4QpzPY-Zf@$%`1^H<~165(F zEK=^JQG-H^8GVq;lL9p-x%)V()Dq%G+u?%;6{Z7yVoUDrm`twtKt3%{{Z(l^DAxW4 zs2ee*`P>AhnQo4`A0W*7dJ___60%Rvorq8Ifs9GaG<>V<9A!v>fRb~m49kwWv@%ug z142YFQ4~_h#%RZF?1fg`m_;0l53IQx$T2L8BYOLgz4%7}o2nyWt0_Q|xwMm~20~-~ zF@nbG8x;5x@Fs4;)3y&dCPp?Bi7G!zVc!tKiXzy13y?oDb^ty^1(<`0oNaYJPrD7Z z;ZS^?#Ffa1*_c>4ptKOJ2?}T+qUam!y8#nL@2FZB&gDh0(cn7<^LE;?vzY)5(+u$= zK9G<7TmabnG&IeW^~I7Ld%f>Er;nSbHuNuPd&A!Rtg(*3R-oR&l@{khKcUS@G+%(E z_z)i`NK1ba6E`i3XhXwTTn12mg0Q~pyGmmcwsp^jAGtrkVI!cjgt#P7ALdR(eR%(x z6^w#O8tZtVd{nQB4c9o|j4Apq!+jd9?qLyNXuqcHArwwZu)vuxR9<+RGN=ykr@Syq zH=`V96qFYl>S~@E!^YuOpX|5v^$#L7Xv#u*p!YkIeFuv^1JqtbDa|nft>OLoDLxpa zf@zEiLkUjVhgEamaQ_e%0jkG9AhII{_I%ZJnlRES6Nt$0c|1}RFa!FC4Cf&@rac6t z(tuVsfjNgg0qmKIei`~!_=6XM^!1NmafxUt(_+{(g}O6|A{FjjNQv&7cmt^me_XN| z(ellJJTY+gDcBxV4Vner*a=~8-ycT6*b|Kck@lOhlpM%H1&72)0bK5*SXlVsCg^D>lCJ3a?GE zenCDO<2V4vjlG>@oF3jn%br{wOa60aGac zc#->Hj2EsW1iI+Z#cc^J6}zYNRoJGwy2Be6FHW0`ZSaTXo6~4t%7xEw!+9E0Zlr;` z4=I4|bce5HIh`(QoQCX!>9pRu6RF_5@{()<*hZB#0DzL*hy|h85cR&B{kH}z{R6{{ zC3|M5D;n+Ro0{s5k(-!9a3S5ghisdGL-2>2RZHQ{XhZ$q4~)^ao0BXGX0-$8FeZ$< zBMg-GIYqQF;R(Zty)kxqQ{=`K%l^Kh{-FWur2({l-E5YQjuGVV%!zL9>N?Oae%;h`tQZx6nf(@` z(&9mXZpV{x2EC&N%zi&)W7W8a&nGi=p$6TACIk!>?X)#IdKUFKOc~L%hVI>u9TtP7{^i%2$#3-c8SHAxGFeX+-sYlMljs^di`BxJvS~H>!f}^=c1u8t`b$9fIEh`=Q;`d-Pu!T&jzyJ6=&C73uM15Ga*5cEEe;?-K?WSytEi8SQZIhtGwy03zG89xtQa z!d5S)zgvZ@eH+rzAhF8{%btM5jxnBFy*x2-(MY1@mCgVXJ3_*|LY+>vzr-NZx;+?X zZtP-d__Fuje=!N>FmIj2eZZ@T`yhz8?$qjqPd)eCYUfL7ojrV%H6L*ur35bp zeBP7Df3$_LW5#_f{nH5K8v;>ebyFxQCL*hYHGfY~FPE2Q5n0^;$m*{7$?9?tDs$aI z`F9b027u|kgMCq#l`$KWk_?)5Ld zt|L2alpX?39O{*qr`;SL{-*wYg3R#|)NPuCpl$}Eu7-Wvst$jArrJ+XcP#`#UD?jP zhm>bqT~p7uQ?nWo96|w;m*w!(EA8)>q$H)RxeIo>ScU5}aNFCf1Ni9%#I+FoblF9F z4<2K5D=Zi7Y`6!Facl24--s(y+utwSn39s_@UzoxB6kygM+kPhS%w0Iud?B;zHd9K z{RDO0;+mhJZc_k3T~XQ2gNKjR$go)-I(RPxU0spLo?TqDam~h}V*Dx2 zcC1;Gmf^@T=;}7*PDWQ30$m@r-st#UFl}AVq_lOob2i+OosBDj0kn0SCZVnKqwad+ z*dJTS-}-Rajc@xJe;1O#ZsDB>>^9|2N?;d&_ofdo0(ci)@BJ=_%q||(ad#rKQ(zO4 z*@Xm~%3v*j+?N$ZZ5Pku!KAi({tnc3o9;wyH`5$L<-7cLMj6l_AKRA|M0FPzM0K}t z0;;=B*4$M{-$|(M#-U#1XvX+Z55HNO707)T7s!1F)KJ`an+kGQEu575E+puT0MIw8 z06Qre-ooc^C&L5qx@B>9Cd2auxx9)zt!%zG2!7YLEm?QLj<;~xs$4%i-X^f)<*r+` zFm7^oypZtsG5nc7ethikn{QO%QJC^AS$Cw%TWDSOyrRo{ei=~jf-dhi>>C)o%JTu( zqI?R_|5Ex zl_3!$bL|<+7tNo~kbe;^AKa^Ec~u=LxQ2T}0#5^Q+CL`zYSE+rIify49G3{1=u3xJq3FjX)cdXMn;syNvO$NMK9LDLNZF|&=>`Kt(%ywd zB1}Od^>SHy&z4tTEh@^*wWnd+2g)2zK6rNm$(2gSV0q)H2(hg+b~jk*2WUq{$y}z8 z!Lzo6QtmclLUWf|`08Zhpxc(2caW!O3VpcFEjiSa%z z%7G#krD0%{VR=jYMGwpl9NaWq#Fp5i0*t`m7zavI?1sNE2aEC}r1kZE+ecaGs}@*} zmcRNkYj`J_itR91L+lbSdi!RNllUr0gd6W9QE?waqOr}VXiqLt7Eslk*lxvy7?_WN z68+f?qYWMJBvJ7q24;_vco7#HFWwV0p6^nmINVKVZBIk?~$)<1FB7DvaEmQF*8ZuWqUoH2`jHQSNxs%kC zP;oabQEfR6ITXe7~u z5*6bjrKO=G&k8L8I=;y}ImBDMEQ)7sDJXdH#mNLJ_QjbE#lZsc4%dsaJtk-{-mOT* z#W=GexRAGy$XMLI(a*TN?K1-8Q3Ya0g7=;RGqE(q*%$)_RZ|ctex?O2PU(vE ztH@r8b6(k~XQS#OD|dX$`Lz zQj-{SOpC`A9Vm&cl*O}OD&~AK=7NxJBWg#ImGgQb4G@TG!7FfErU$4+!sZsgR9u`- z$v2rWqIsMSdaj)EVoGEfsk>sJmv5?P_miyrJIW%;#|K!}t4b6c)|%W;#s6DxnI*BZfXQ ze`WzCgPJ))>Z2$jLCIKE*Ze7qnPGZ}#k~A-p?FE;$KFAVVurjAHz3z_H+~A=1UlN# z=FUXrG561POT;swk33s8Uo|cMUcLMCq<&D4xjK22W)3r*N#=A+sr@ zg>=MB>Q_Y+ITw$o(8bWcMsthJDirE3Av7<7=V`Lg1Q10&_e$rr?na*q926ZoM3@4^ zLfh@L<2a(oYt8Q&x$$x#2UXnR`~afJ;>6W&Ub)u1PnDU#)42$SgbyT&d_FPz%_~>x z_K8=mLEts*psH=o_zEmz$gY+;h+9iMHo% zTc=G%6d4z`EH3WG=1bLA1CU|E|T) z*MWNRH~8s4;rkcxcO@h|kN-26`thIf^HnU9{!KIJ9Mkc$e+1$)AgX+Z2^-h&SymlPsriskNS40%K41fOtWROGz`FHrc6!ecz!#_j~xdeajjwtdeCW-u?+CuF~ z&_w><`1f|A$o~s*_&>G(sy(JXuKg9F@(V=hL41CS<+(p=SG}?ZPLb zW$X*tB0sTSX#3=Z_Ocd+pS9G>M;-CCvCJ+1Qhm2V%11d}APt)>3$%3HfF+joDrTd&l1kFl7RHasJ0Yt>%Y zY>=|wyL-y^-Mi_JfTZt%6~4Q2cV*@7(aNyj??2ws#$15sv>jUbg)eF=xAS2myGM3g zDt8Z5+V&s+;)0(fvdwqI&~EE)99wqlWf1vo*LGjUp|xMM(aUW1XyI)w$06zFZn@o3 z_Hx)u+1YE>cvou4o|SUV)a;jDdbw=-?#kbfRqDSNgwXN{yEw6IU=_wU|52!+dD z%3iZ_<#)+)W#pP{9FC)ZkE69p@9)DafB$yUUCM3yE?DN0n*f=Ser z3MnbujEWYDvP7k#LMah#v)teN+&gXLc|PCY_m8jVp=D;?uk&8dIq!SV>k1gS2j7ls zC1D3rNFf~{00z3B6o5z~!J#nNUlAgJ>H?n^vGed?L@r5>WJI?`NQU{k*jc&wC+1f)b#nPl(9Nj8`$-c7i<09K zSc!qOXpq$zE0TcJ>*a{#6sNUCC=era2~MwV=5leI3;zkY0xsT+H^JS}La{h8NI`_4 zdyoPvnw@tLvm=(qj7=*>jJ&96MdK94hP6k~gFsg+e|8hM9fw<%nrnE~com3xO)V;X z4CLfsI{`R=55jN;1^I^R;vLo=E6Pj)2ZF3xEDocUfvk=QaZuIDiji0$z_|jv6%O^) zVAY+~id7XA?_QUJJT^P)esVesp0p_FFOeKw(u4gy&s&QJp%0=#C^0~f#0oCX7vOwq zYa_u8*(n^QTu~v2g=5pn$w+Jjh!yx#!8I^WJMRcVER_|@;>A)($@Lfuqk`BD!YfuT zF{NNYfq;;TSRn-!SWOp59@INtLNcpcvIGNJ3!D_o0-`e(EjAem<^yMAf>5wTn75ss ze|~ef+}buEgao!ppYxo#g`e&VkN{T2w0*Z7*5Oz*&xBZ5rSwQ zVGEbUT6idhfKO?y?R?)wa6!TyYt@1(B^Wf=7#TSY2`8lsz#ih{sJ){FEM9^bixe&7 zfrKdFLS2&%a_}RkhF**VG%-jk8~7b0)H_g<2)h+2~w;C zRzdS+YnxnLT(gos=DslEO=nU?pU1B;_|_*OAo|I+@a8 z9v+1F*2c>Ba1W)B?6Ded2qey?^g|$WGm8%hlz0|Oc)WY?(Sj5{03<)?OY>Nq#1zEw z5d^70D?Ca7Ao|ce!uRM<3fv9{p-FmI7@S#14+2FH0VNq($eT%mBwg;y@AxLID^7+P z;qBrLp@X-65JL3wJHl;-1PGr^CiwBE5PDcl5Fnjd=7 z6M7QwO_Z_;U2$?uUl#@xKoSDoyx51>vAPz1L}W=kBFTt=B0vOeoCJv%f-q2J@J&Ge z5KGS3NL;)mP$@K_Cyj8;P#7F3bmM-{HWN|F)5 z3@EfNK?E2*>9UXl@CTNP!dDQ7vG{RNh`duFx|%Bh5STrH1F%1pqtJLfFrJ`Ff;1ko z9z0$iTqFba6ctng39=isqNiI9 zODZnP+c&+osToeE0SxUuq0vB$jY6FWFe3Jf3W384;)0r%43n?~SP!Dx1yYosAjwLI zgtKPoSQ|;zSez8cWl1r8y%S5Dn&GZhgoP1q>QB`u0_Q(JLi9n!MDy}H5ke~gp%$Jc zn|7bn%HM^Ea9)CBEGQ-PQyZ3!Q8*7eS)xJSF|hs+REq&lWhIJfk`nTFhDIK8Qx|DJ zp#e!KxvaEw5((lQnU7RSQ)oYgMCBlr#G-wJ*`>8rf@-=D>u_PhkM{-C4QFLQ^H!~uy zrX8S=1%dp8fD$~$+0t3}3AG{!t#}A1ArdKt&eakOj1YQUmUxu6e|l*}RWA-493gRd zaCAYW4+CQtsKg_1fZXK|973ZAeu6YB7HK539>KXtYDA9<@=auyzODc$@tO)KdT>VN zZ=8#8U>&sLRlzI@TK$QJg2I<2NWfW=pcZ*1h(beX)Hg^idX#r?dOjT9?FJ)Q(*`D5 zL|70T2o4z$sEJB}-vs=Hv!!}%=n;+3q+*%9%5`FQARLR6A+;pHT`}zZA_5Q`29b?U z$o#>tNJPdj0!i==s6K>|0q!D^f(gA~nIwp%`*y2^aA3&|YC%czPh>wPVIT?-4B!mN zsEE`8x}_d7_M*wLv)Cv$P-u8WC$L!jSP2LXq07+0Dl*_Dg1jTr*^dh$Jow-;A=sZp zif{%58L&<0FYGlR)RINDy;rFqq>>~vc4zPTtt>c~N-ac%NixpYKPLS?AiV=5#QB9- z?hrF3oYMJ&J&~{>(yXnT3jsofY!;L%3MUhxUUuG0q?Tj?7*VJf!I@ZwtSAM+k(i#v z1~?QS=y-_;VaI_u69J7^Lxp?q+p9Z?_&|0PB_?BF#TQSE@prLviC}SKC4x1(b>m`L z5ExK2cr59-AlR~{Wpz6ZfgzHcfrt{}B#02H3-nUzF7s%PB-HY-v-9nYrGp7cl}H$v ztavO%CRmU~z<{^VQGtIaMtam@|ggff%skiMu{jy!)tyK9;1_J#EeXbI1C00h7lGNp6;U%STq`u%F;pJ z!7=g4X>4|3(Q60~WI-TBg5rT}_!kz$Zd3jQK$O(TX)?%ZgnAKR$sjI-W77O??MU85 z!eugXzTOdufJitE5J~0!&U}dI;`l_awF==Bi1k|G<9zTOVN7o(FII{fi;Rh8F!Wd; zbS#@vn80PpM|(3OSlxKYdms!{{5#npN;nj^NIOA=0=YUw3tey>7}FzyAB!_d*O3!5 zLZgD~x>&N{xQI(aFe0(VP`VAsZ`k8DQZ2wCmN%qUU_+N60w*>YoysI)1mVzVM3TvZ z+d>f#m=RSFSVMzW0}&cxu$D$=c}Ns_Aqp~GI*LPI1R_O(khUXF&!a-mW642&Asj*@ zG8U;d)ewyXQW$axvynh@!bLUVBY!(PZ`k)TC1X)UAQ*H=A1OnGgnXPYBlx@!1MDAN^vq73joyZAYwWp^%dk3qCd~tSqgbU1i;B#tp$b10? z&p#%Xu!W$>!6aMG&56LBOEZr3@(a8kr5jM8^u4 zcr-<0L>n06<%k0GNbKMTRdj6_v6-jhCXFmJ-x2M@R&rsRpL& zLzNP%=^*#ZrQ#$86MA}-kUudp_$heW;FKWmzKPfer8)dh6co}_vF0xGiPPvDco5(e&#ZKTv zz~n{X*#E8);9Mqf;$UteDlu9iJ??Q#Kb+r)_DB$JwNw@GP?fTSVc9$|2&^zK-{Gby zrTF&4C`EY!5!UUQKgsokjUUOXCIrBMa>C?BV}`vvG(xZV@zU_DL1{t$p)hTsIUcQ* z3Gv*1()-Zq33rLyYH=hx-NVki3&m}J(J*kBd(-$?ict(gG)z;legx4(DdfR~NX{Pp zIrNb1u4+0GOhgm6S29X#A$uMv82MLNVhO=ep2#u7OgkWLUKfg19w9v+OdfTjtrrBx_O|oxjFvGZvaNeE5-Q@C2Ie2c$pQ!T%tSqG+)=FbN(Syg0Y1sUpV3C5RhMjbNw|l2P!|U_DLP27AEe$mVAS zodnYm<%k$KA98sh?mK>sWOYq5$Sn0o3yx@oh-i0W4GqPPbT7yyvV!WD%>%)lIJA38 zMs-doxSz%U#(M|G;@3z(cb!X`g^Q333D5Q-p#?kfeBO;20uDc4I*Z(P{ufkV(mMnK z*PWXxplpZnqVWg{Lrs85b$>KiMlO-rL8a#3HSbu?~Y$1 zj!^Qw?R>e>w1{YH3Ku;`w`c2w^uRGN8HbxMl@=6A_!vzLJplg;)t#V*j!d3c>O%h@lCJ-a;0_1X0I`%|2dcqsGK}t{Z>W1iA|l186yIz?KEFho6BbIu15ucJ z;-MSwzv%6dZpdMs67O1-FW}aYlrY^BkVlL)I!?z zPWmJwX-UltZV6r{l@$z)OthgFPWdE_-ft9he<8GM#ko!CM4c0fhz8ZjgLT5-M+|cW z&m(BJGh0x?FOw=^#UM+fojtJ%_&=bsYlYiXAUX&u(n55)&4~69-Bfmv%oNQ?J_5>T z#t_k1@rNCIN#zKB$G;KTAvmZ{9+1;$rle18KplJ@e zUP6fffxHeWM9y`n6vD|;97DHl3hN>2Z400tih>Ct>iK1`Jp^Z^38S7!uwIS+2jaR` zxOE35a|BVSAe)g|Bpor3^WDK@kmDdQu$|duWmNztUc!v&qZul_|4LZbD8TUwm=D20 zc!UBn9JvbV)~F9*9R<@2&hM&{tj}k%vL5$!QMdj67p}TSfdKi*BdiPEbY~5A>Z4K@ zTndvEs*@Ka z$zpopfUMWQ3MaQVVo;Rzxbyb}(UKWg( ztUBC*8R@EPk?iJl7mqNsC&nYh2)ko_$K3%JjHQTiU-rD&fOG43_0o;?jbM5fyVupo zAb*h2(SW(QRlui%Q9Qz8W6`FV$PGR**>zvKO(zySbc_&>a~t{faK^g6u`xe7k&GqM z+>pvbX0|SP^cl>oq;QdDmIvJRKs4|`xH}{sStOxh2rCiDfp(08iNE2zc~e%#;qVDC zk^R1&Ia~owL1?^2dP!P(FBBOwEcfF^3~y(R}R!bNEmqD2?@V0Ak>VhIO0P9>UxFyfu#WxPF zX2!+|m?F_kh8hr3b+4g8tu`zhqi|MqOvm+cQ!#6Md(Xg|?|D54^_y85xpiPTpUE)i=^hWJWIgQp0B9wKohKo?o&Aq3E4 zMIU35gml#jx)v7tZ5EWk_d*D<`jRY!A>7w+`_Re>T`u077wQcfq(OHGbf7_yfdZX` zfrtoe#hzdioR!MMR8=QT)m_cC=yaw8R(IiiF4hT#s>;to-bSu~jt3-4FQFU;=^@sN z#798qiI*Y<{)Q9;@eos_vk4dc!16FDP+$aspl#vU>P)%tiH~;yLI=v0`Z5j++yRE_ zgnlt}55OC(wUkCAzd0|)+dB+;LA(@ERsvKHQv3i!a=i%4%(pqVx#G?ut`|Pzcn6o# zS=R}1CX>bas9rTFt<9BS;p4GOiKl(*@0W zEMITmsFV(b77IbujYe#A0FCfX3s#89lW(beSj}~IVvWFC z41h8)sZ^EaXT_!F!>uuJjfY#^PFx^qZ50UU&3WlDzP>@sl&&<%lr;D+B^j9$)p>#_ zt{W5sEuUhFLfAQ4gqC}c1q2@I^b~-ql8(-S)i}4av8t*}P$I%fNiJ!GsiaD>ET5B= zn$9k*sBOZV(bX4pr5-LawPJA3uS6*;CdfA^8u*IaA=pWs5w=iavfMRe&oCtj#t{&U zfNZ?M*2U{sKyX;#p)LYj;3ywhiF2#c;#hIa=&&Gb>!dPneP@+OSqXp(QZcqjeklxq z-_+SG4LykTn3$-bps=`(aPAJ<97zRn8{7)lrQdZVcg5?vKU0_~lj&Z@sSv(X=$*~M;7$FapJ5o`!M1~U?$e&-ZQh-K9 z4&OG89ls3_KBuLcH{>jP@M3}6L-O0l!z>r<^!9|WUx!C$n@#4);>p?z@D zojdvY0?-zKxp2=Wo<#>}hP4ib3Xw-(Q-#I`bc}}3!Ofqr*S&7mUWRN4kD8bt=&T?u}OkEog97^+{_&-8p3cl)KP1LQ6la8 zi~#A6&L+GW7+#uycX6=YU~Xc(OkhA+X@M+&69zyrgHe7F;z$#~+C>dFq*~j%cQJ5x zaeHe3RijW5E-u7Hwijwn9NMVE%Kn57hWz~n7AEv(`pN3U{km# z3)v5;z@>p-W;AopHOm(~Q`mw_yBZF`*0f!1_ zC;Ua#p$mSCgAKqMNJ$7US_SqVnYM39L~a$Db|73yz+Js;fu{a+D^OGfY)hkbfjm$Z z0rLQ%3!)hQrF4KTaiCa3Mu2dmm0?wVz=)cFX0~oHckrV*nU$m;aXTphTc)eKKy$pl zUGD{TAvc`3FrbiDlurb*D9qe237FnE>98vA+e81292yQg;; zG*Kkng(aWg;{w@!QpsMZIFtv%6OCYJE-D%nT087nDIK&NtiDf*lHv~oMMy9nAPGh2 zPx;8~WbmR976vawIU3r3~p?}Fv}3noY2-MgWI@T=J8K8c2g z>N1c-fdL=tB{J}DL+#gRYQTPiEpB07utEJ?Mu>#$1?_w51ZiE|7PrGUN%vE~Zx?{r zNTFdi^v1Ck4AU0L{GHaZIp)HGFL;+_mznj6g>qMjq>aNtxR%jj~q|?4Dy;l-iqEmO`kEMsw7;PP_M?JYc>rwgtSe%d>u8%m_O@p{&KuCB@mMml&P;oIZ&?aoC zXlpUx040Un3sjDg$}PPSE*zs5DRdBI4yyaG7$bzPTxnrp489@a=XbT?VjvV?@C^rHjV*Um}IvaQ#HWR_!qFm}EbJV%l0rAQrm1ByV^o-xPI|NN>u8TfGBvn$M|0oh1_s|NIVSOScm(SiC(?` zOQw(;4rC4!_B4>*dk+&bWr^9ENJ3(q0$m)%V~^sRXn8exdPPDTsz>DD-$WAb zv9J*QhfEySpyonuxB(<8bW0T03s75NjK+wY%Lo@F148|F7A8b$>4kC`v)UZ`i={Q3vR5WYfQw8#frZx+RY8O-)RnN zU4STe{$AW&x=+R-Vamo(W|yPj`!`|T+;ICNjnNVZl;rP~g>eaI6k!}ASJIW@mE+GZt;9sQl(86Wp+}qb9gxm>=62U$P5`DQm3a5V& z(?bjQAg4NbADE@Djft`Rw~QWAxXTwBs)GeCxPw%WY5zwNBqbb>vH1n(a6z9w&iNlD z^bo>r48G9NaBm+N6d8l?ZWkB=Un%>qhUle(LsunhgUMYr@o`<=vrV8y)$R9bG^Gvr={|IDl%00) z@%ObkhjazPf#as4D~RcEz|Z!hgY&hsfJ^i5;ltfZBcuNn7tz5fp@s@-PieZ@SvUvg zROTF62NUOVFj%+42E--l;1tkjp?`?E+1WUH-l?m*x#_<@`a2z*o4bvTb3$3&%_E!s z3$>RH4#$R|QO~!xb9D4gE~~nEq&q$awsAj3IMi*FTWs%c=Ny#4;UqgkY1Y)_4-{7< zBOJPuhqxI9_4lMHs6Xt^2nq4Dvoqvt(d_b=*bB8R;q?wu3cLtiF+Oz7 z;ho)=A8x|yof!Nq03b242@0*O?v^fbg#gKDgE#OfB19ukK!yG!mFzbQXxHJ@pYSRd z8YDc7E9|rpo!J}k(hq2qbx?S;E@+7*!_O`7mLJ0QSPK076>Fv?z}I>-h%VYy__hqX z7}ww{`ZHg5*-8^z50CEeU3PAtiD3_|i5D?xCl_Y}efVBfZMvPqyqWX1*iW_FGJnR@ z88htXPPLn1H-GBZS@Y)3c5txYGT(L!yipNb0d#EpF*_htvjwuYt-_yIVFo~MhG^j& zAtiS@s-Qn4h}3zA5a2ii)04m0xyQvt_!E7L>khYNI~`nC+igSQ`@aJ*6aH>Kd@efT2b zX0(1chDi-Ve<@gG^iT|wTy>fyTE$<<9|nVz1C+b&lJXBRlJvG3i5wT@2I_?CAD6-RV>b?OP@2EWjco;ouE5f zq59~PoX0h_)3kjg)!Z<7`mL?1yZPfNSjXW-izbg{i$B09`%0zg7<*+Dd-_N}T&_Vk z!kWT3MqzuLnZJV0P{Opmf^_3BZ37D9!ubhnF{TJ+Q@F+MBW5xcvr+f1FU1%aIwB5G zFso42!4&2hOl6S$34P4zA1tZZB488qWAfjIl#-d3>{o(U z9J8yaKW)g%kivPRO2_6bv&*#9Q2J=9=pLjWd8&2h)v^A%XD8*3FTuBdsG7p1X;sa^ zZfw({95^$TwQ&orZH2nLr3d>%JBIzZ>&kgKkxpYc9jz($#J?@!8#2dZ42NZB-7##F zzS=aif?G?T&@oJ(>7#K&XT(p=&?#)OksQ$qjug*k?lE1poJYFyx{_NNBX`+MN;;xD z(f8SnQ5rUyFSSR_W}7&!oS*vun5-+P8L zLVZ$A7r&HF*UMzh8-C2-vefgf9y20OD>I{>?@AlK_|)8(PtUJ8$-O(RrT1hy`}0uo zSvfA#r#;Try*Yo1M97xHn`4utuRR`q!y<`x*Zlj%Y zTdpcIVyTQ&o2~FpVx9!;nCT<+u_3G#X%n&(I&+5F&79$9X*6ZrYsJ%pH02MR(94;p zrs%IXQ#~`7y6ol^vl7J;gOZ(V#(kNR5H;Iq__&b#cU!loiZ2MAqB1$}c;6({{hovG&8nH3i$2537@}n_VYne}1Npd2HmGN>+@S!kp6^bdzIlueomO z#~L(yPvnAUN0pbYxSD)9taP~35T|zM>z_Tc6e`0;uL^&@uB7mb;pgzrw4a{RGQNY4 zJ~`nyaahz)@u7~xJcnLCZyYzQ^yIK7X4B`*XgvQZLN3D9+*0GV#=*g73M9jphfN3@ zp`mG(kQkTvK2gfN)x6N`bi$^!hf)m8XRZC1Ao23tHS@#^CXH)HtaVKIhvk>($Z|DX za^>)PzQ5S|Y~$?JdRI)DH#dL0_gF=0%dlJfrl@Y0x#qjaXHL$9o6p`J+^cc-Jb%>P zlZz7*VixGlT0U#ttu?Ko4ok#8o_Ftv_E;tHX<~eM>*0X+O5Y}Zm^318wsGbRd+Y6q z=fclfUNgF8dd;x${@j$N_zQ9Om)>2^^^w(ivRvI--O%xLk?4g_Yu~P|jF*g8Ub%ST zuas$t+pms@xvTH_aA$n;`HK%WF)kXr#=qZx|5Mkl;)H2@1}Yiv$gfE+J@PN*Bm>O`C?J*D}z7-xl_)Mtv{-L-0^tF$>U$&O}-ni5TCg!WYx8cuN|{*e7~K4 zJ0WA(jk+?i@|4>W1>k(-j;9CAP8P}ZS9{$g<%zqhj2Mr{~%cz4<^rG*v? z-$xcjH!nGq`}5ovO-IXO`Qox!A8!vToRs5yVQo~Yq2mz8%-u&@Pn`5$ainlsxYo3& z5sxeL?$<8&_~pK_#;fGlg{WImkD6HJ*PG`yJ2(4PTzWeD(xi*)XYGETou^lATK8g! z)TOZL+pCfeuhv`baoZHQKz)~-t*wLUJI_kQO4^_!p0 zV`t=L6t2#8y}0>!m7e!Fd@JsSzrf-d<0+0be;*wmD=N3c>!9kxpd|~-?b}k{HtC#V zX6g*qIejGgNF66x)hX|5aI$Lqr}IT;ikxMSn;ic9`nkAmz3s{D!_w-<{f@8mT@vJW z!gBbF8R2t0UsUMruF~()Kd1jb%5lc(1=pu8pQE9bIBnaack{AlXDxX=&0+o1SC$tn zm$|GMxnP<`%G{kU52|=gt$rUae31HhV90sRyp3-AV~QUAJRYx{FimmF!gJcjCsxf5 zZPAg}U@4y(|6`En_#nysk48Om9IN?a?u!#;de$1FSN$;3Sm|~4>zR9V_N(R2x;mvU z^O$-<@I7N0&}I{~*fcD!1Bt!Z6&%HjJH zyjE`a*~BS0!bzuWZ#NdjyL>N<&>HL?kfKyRBz&-U*~E%{ zbtC*-3m!&Pgr+52%gNkY>`>zHrT+cYi&nDd62t4mWp~QFeU~OvWs%nOt8HnyX85y- z<#&(X*2|22xaiJ3`}q8#Xa6iQyJGg!tjla}b4g{o?VFCBFPcXjxYsuO>#K6Bd+mI! z{0HUc6!Vp@9A4RTmvL{kFG=xF{L*obyJKVWsvYi4PiQ4HzW6xV+ix;oz8Y1s*lf+| z*OMC!WuJ_BAh__&bE?c-8S}vC#~;SI>F=-o(k@ZeK3ZnsyS=9lB-MzQj@diPag^pZ z-N+x222pDxxmI>oS*xFFy?EX5-iv2gK1MEj_M-Lsm$#bbJHPvKq%_3wNAal(VHXY^ zp4M4mQ-1mOflphCsBpZxUCy?=_Vf86o-ky>6iXx*K4k=GY)-qGOE zut*S6y86l8=(~|AnbzAgo4xL*A8=^@GUDRAqROB5_kUN$U%$GzU~%RBRxj7~-1c8p z%9V$Asq>2p@4od^Z%)3q`rhWB+D$rd^(y^dEwK_*lzpr4-p2N1w!Ww^Y!^Fzv{-QF z*J(LD(bEy93w>pL8!yh+TCm{5l3n~Sym-Cht;G{A4iQ`y6s8PO);!$ts_{+Hi}NpH z!heK^Jlt{cD!+lrspwi zi0j$Sxd!mw>}C2oX8YcKEt#Q^tu3wpB3*s!(?@i*xnl0KD7&Slrv^&g$(;RdkH*Wd zyyV0nwQ)CI|JwhEJ0Y`)W3{{J&63JP6NYhjOPvnmykC|Yb;Mg?%m=-LDq1<>1AX!9 z&^~xVF6S>_`HTeftSeu}Qm5%^ZPs>iV9lltv9X4`LtUBS7wkJ` z{%x1BY|HNkN%xv7aaf*tHlO|1?IdkTS5hKQo8Kb16WMyTgrKPoE#ftg! z=Q}$)o0you@8SLG>gwy(t^4`&r<0RYTU%R4M+e-do{@0}_FDJv-+z*qmz8xlH#heo zn|0mX_YQnTkc?TkRczs_?)e?}CEDhK7dP z+S%BH3!>=K@G{f6C^tvg)Zu`Bqgz|-!#J+Nyy7LOnD_Ho|kvT@U9Z=a*rl2i5{ zI2;sw=G^&6%k}HG?Qq?*ci(1PyIp(s#$JglD=Rx68I_oLjS_~ty6>Xo;P2kO^FJBr zcOn40i(k0J3<*7lW#BQFW0hXwkx>_vig4^9P6@<=&xZOO^R=?Jrkug!;uEmrIK>Oc zuH)D({Ftx5qtmvyxOj|#@89nwTY%G_;CuFYMP0ar`Qv8h7MEgT;}fpAxVV_EF$*~t zv1+x+v17+D5B%J@@Z~F3eCxvX^p`5EXH2__y9Y#8{KT`HaMovB>N!3x8ed(24?2%~ z7V%5I?%cEv~?ys_2gzu5=rpcedZa%o& zSY4al@Z2{!GWPPLFHk#|mI-Sk#|LEvgUL@Al7N~64jC02LQiB*4~jQurH|c{YjNc3 zSf}Kbg<%0MkJm03ZD~M%JXB|tW3;uszQwRJnI_*K2U6_Q=S*s&bslevYyTFL|1Ln~ zWZ>a{l2qO=T5|EzE1Y-O>=TgHK3yY-_FgWLW4b+Uc%VVDsitXycQkL&v~6ou?sFQx zyF?jJxb|vWhUJvo+uulc1z`m#Xhr__eQVH@t&OjwX|(e`{pV?#FNfZ^%U zneA8>?dZIL$7K6B_sQ|Gy-R%JyyL>T+V zIA^I!tjR1NHC|D5%#WH@?!g+j^OqHsme#fIU+$7Vf6Y15wZS0=+M`!J-yU6rEIHo1+zylk}FlBY&(lC!`@wd~mV;M3Op4O3Y!7nawL zI`!q&ZX=agY`Kxew5vXspE|IOpAG1tHix~ZE1wi~TO_to zVS&@~tn$5dYOk@mD$*+8Hh)ZEKOKvL&+!1o9FqQ2z>+>EXPQbA_!x*CHT}_W99m6&7 zsFC;;gWQ95&R%=#^Nvuij^1rE$@oCqyKAK*pQLX{{(i?qUPNcO5lvx|Lawc7k+_T4 zQD3!j%f=25oKTZvR^XaD{MnhSb_?HpsfggTK6x_j`p!LLwy(vc?(o=#?GMA36fQ|v zbV%@Z@Mv!ZjSI%BS8N_?b1vBBp;zegrud*u@v~UN<_tfd;G{i=Z9uVRk27M>rTsp* zrI{$65FIO`GjjBUu`P53)er7R*d-S=4~He2QZ}%|#^&aIlCXLEVT4xT;=_WO)vFc1 ztF3*y@}HIkS8QTzM?c)>vFqOEsrL^oxv*-#Vt|R>bE)~5HG9eM`}uPon*<#fXTEhg zS6G*^@#nLnvJ$?c-#<$gB)>@)Xhz`4K*Dn^^zj?7#FXa+4Ob?BQ1cTeC%6#olAqw!`;D$N`0ez zyi~EHZ(nIk8g!bDZgw79qrNFu>*luR87nv04lO=wKQC@)*0UX1lMAQ0uWP^bw5?Gz zAasq!yd7s2PP`g=TU*COKKRvgs%}8=@|YZ5^`@EmwiToE4Wr=R~o*+gah*OjYg zY0SwC*!to*Uv>9oS#jDd?ZrB?w5PEWUKB*|?tDHbH`?m9)fwHN-;~o{t1UXE0hBF_ zw=E-1Ctlf>K0WfCYSl&8P@|CDfr00=BLbq8&->_ToOH}JDHpkCxoYVd9p`OnHd6a$ zX^-&^ox&PB&cSeEc*1nC_ZcH!zS{rn^x5EM3iDOLdIk3*0naq6Z+&-F7JF#H{&@Xf z=^!h4gm#epr`Nw7)d_0Tg_fo=!a?rx;qxAE|CP(Yv1c=rg zl%3^#q5XAQk|ggO!|+mB$Fijtln^xD zXrlSH%2!%Oh_~=rUvIOM|!0yn6L&?vp2uE6%LAQs=PX^t;DTm#q^UUq2*w zo(9d{ck8|JFU(KK*N%Rfcb>XU>g0$`*I!->)6=VGADzt@Ysc_djn&?}F+X$BhVPtP zr#n?zwo4jOU#so1ky@tsC0^Mjd(!)}KURi6;|c*2Bw z9fPZD;w(-U94%O>qjJWy_~Y7PE<1zkEq&$}tG$>PXTEfQ+qiq0M`UExH3ol}Dy=nn zT){;Dd1|7%5l3hZHixm`a6cInpHJaO=kuOlR@_@3-}psJB#`}vCRoAtU70Xv&B}X5 z4!5;#WJa$FuMFChaw}YObMuBfiPbZQJ{tAo<_puOA|49*ceie%1{;ew_~n>f~%D7LgjW%uIeT?fo#DwZW0w_q~*reaL(r8k}Ojeyh*r>>F~`vN>WcQ>Yt6 zw4X{AKfk(r^4uk-n%-}T_(p*tR)U-FDRw{Jgi;J~bsN7oOm zzZt5c&QHwV(>7)Lm%A08+~zAgMV&gmIkV(|gUZr7$2oPo8$UVTm{9-Z@nd~O(>02r zC-S!z6rFR3+B$Q;NLaS)ihzQ`r)FxR!={!Tb=qOjsO_LIpS>1yI(XA0IQ#Xe!6%ly z@0jvnTCy6Z-10{Cj$qiJb+HB0!iTBvoICH^4q%shU-2g>Njf63@j{rs(}Bue|&5qvy9xUq+2uI@f3Bu=9_oDy`pt3=J4F%3{p; zHFI^tE!Dnj(6ZLmH0mARHb`uX<6jaZK$go%}c-<6vbyyF)3{Ze?NO z+R}DE^wIec#r~yX&$M5XFN4t#qXVk zTUC}^@oDo@X-{I`e!r$WZSWI^$`P0Jjd$+5n6X|jm2$!C3S5v{oEj|^UGKzm6H}RBOWSfuzljyMXK*} z4^IfmwaK|F9?;HJY?(gs;;4tyULRR@?9CJP(+68ujxV8%HLh)IN!HjQJGiLG|6!fT z=nI%w_}8ZLdGCfOk7le`HM#Y433lvJ^{Ey!X%!p3)KH3QHUCDAreF2RF%zUrML%y> z-+6nUck@(fo5zbo)oX`TdbWQnUwu-AEgf*OSVS`YrdbkumwOwXK8P)SLPPz@H|GT} z_fBhU=uk5_vQf8Ogb{szhV$T8pTeGt(Q6*xY~AzaIS>py`Z!w~o1h}XbEM1{xpb)c zkP$;n(Pngq?VTNOB&m)S&ADv$()Oq6Gv#fyRSwQdw^Rvry;`O>i;me=%h>MPX>7$Q zD{x%yr9S!L4^!Kk<5I_$6kT{dGytCRqd6rswlvHw_nR2|l{pZ3}l|s*@L`X`8AC74f#d^8Ix2fMBUMLn2tdLjp_kDRy1HI{A@b zwWVvT&6U`Mgapw|Q>Wf8a*p3}C-eUO16N!;o!3vQJcZegKk|0iiTts5w#vq-(+?gr zaXLOtLKdI$;{JS3hL{^$objt8|M8ch_>@6PU!*pubLOrvvg>?59HPC+dAy% zqsb?mV^ofAeX%3?%9HjB-ip}g#u9hxzON>G6H_7wZN$4u8|UsUW6+Z}KlGY2it0^e z=(WVEIE-Dzc$l4LY3t`HORl3dN7HP-m~><~L0aWhWia z;1rJJkmu5}+9tscY;5u zPDu^Lk{{~0VGlGUC^Nlla<4sk7`R$1fI|N;HmG6d{ufW)ZyIq!au9Q>_RMO?0|l?T z^etb48N1der{XWK=H=z-tzWR7UQU{?SpH5-{2$*@M!~0Ux7F7ajUIaIs%Vhp zA`}y1&r9EK$>5wGr?uj;Vd3hfW3S7KV3Q_^?m9ol)8_DKzbM}0caC&QC}o#y2ZcTE zhS<)soE5K}N?KIQX3)1RG5*K1xr?{e%IY7d8=1pYDIs^F-ImX#ofS*;)0y)NlTTIE znj&F2nkJ8ZjDPsg;pQ7+G=}WfFAXK4BTJ*UU*d>h>;h@H=)Oqi=_{t*^F_bzek@Ef z`uWz;=b*u6#r5)E#%HFvY`rpAl`?kYMmK!VyQuuY?_=bHM+VF4V~LliV|OHdC$8CE z_Q-Ry6-}AB9kXW_V>U9@_}2T2B*(LpG6c093s2@naSA$hYR^#C2Rgm@xI~1KS5CV^ zyFLc*j5a#w6#Mw{wP|p{q+a=DfTw|r3ByRv}CRvJbukW%DiIFk&i^N zDhVI&r6yfNjna5c0(x+;|;8)K_ z4c)lTGjyEM!4X)}cS|e`bJp?3*bkNFKHqMWe7M^4iNtJti24H;ZsY{_5250^uNA2k z$8*HBq$A_4R;+s;YBAH&fPI&CO?v+ZBW%_bGbWf@^#1pkA*(+qYY%HlV=lphPd@jH zxESw~&ac{B&_(t5oYNVUq_-JkT>q!&z~vVE@>Roi$~)J}t$buO**ZL2K9oOC#Jgl? zijL_y(~)By*l*s}pjYZK?`~C`)?UsKr8$9Vm+2ul3=*aqY!FY=*P9_4YP~}K+mQ!H z?oGLI@5Z;Rr-fNAkKEo~*yuEF#)V~pbKEDKl?$4`ux-hwxAs1Jj}1Hb@M~RTXJ<6N zpm@PI3kmG9+@jYRb~~IGVo&$a+b?j)Zs_Q|<)AfRuNI5aeo3hw`*Xts)u}r)?b(dY z&$eKj%oR32-FebT#4u1p)~7CY1a_YBYnBgty{o8C%K{sbr0-8uW*!L~>KB|x<66{i zeMGH4BVIo={PFd}^*6;Ah#O#w6jx%4WDbsNrtPFT zv@I-?9yuqFlfUdxhWSY9SH;_bPHX7=G_;W zQ=LxidG+i57O5>;MPy6{H=g#+Dx(IptI(=_PVSPv>fWL)HhrTywxc@x`Z?w6ADpWn zUdUQyQTzHZ3ckw&6zdKu>XeA462%#$>ejkGJwm&-7Z)k_-P zB(}Ke;YR*6eN1`2E;iao*+gG?`sqb(w^V1%sJX8`0h1pzD|c@2MVTw>^O`F^iJ8HD zA(GY?4K85&X0JEbH*hf@N(u5gn#`CJw?GYBwOy0;S!XGtxv-)op%q(97T>t$JB%PhM+Q z-H!eco@MB$yYZwM=li%}sZnYP-fQ>L61K4#-i%0|TmB}>lP+f+@^Fc#`(Xb2~5XBE1??=C=O~T@m)|**focW!~xW z+dlJNynY>|IrG$3N(o{J(9>&nJY(Fo;P>`OMv)bW? zxpD$C(mZU0{>d!;HbtyaBH_hZ>Uwj>y9ExIE$c*+yjy0|?l^A1TGn)g%{#K9hNkYi z|KJ39w}|D|vD4)#_xu~^iZeGWxyf!7&kzk;6B~wEn#C{27%H#)@ptdda=bf_nVDuR zvL2K%CwoNVcj^h{k&JiO2CuPSVqhdAqu0Vdd1&*H9Y%&?)n9HL<3Ap?`_ox*D&vmq z@n-6WnM%j^W5wCK=WaC_apzm!i*m{ktZYyCW=$3Oz2U_}wzB=%j|^|9ozKltGgH2> z%CB^6!`M-b$j~ljFGO6zxw{rUW)`_j9xrl%gdk?`D%xjhnN?*E!~`s2E%S$+!4 zDH>lzjTv*+44Np_VmFWNojmKfLt@<{>Gea0yQsUe{C*8OmL(Z2tIalCJ=eJ9^V`=! zV^XDWU_aQk2lc*xxbkXs(ZSht?0cz~%51q4kBm;0vkzQanX_Dan91HP+Ha(!R!+E7 z*?cRC&ZysYQ~i$8%J#d#^wiBS>@!80&Xn)4u%B-EA=vQ4n9Rv>FOAlGR8)7Uo2u=W zIj`fC&Q&ujzu}fuYPox9`den%B)Oht*1KTyt6sf(7k-YTJl(rFa!%&sJ-0&gXzC3| z?c&TtHVgI^7fBZ|Qd7z)+!)=n2{I!k%Na3j5e01NWS^~-BU>h8Hs>leBF9@&9v@d0 ztM>S3in0#--PkazHOo{?FN{s07dBQ)Rfh8CkNy=le`u)0XGwVG)6*}tTuMxuy=MK}^SYayl3f;P?ONHeqvnj)#(6uG<>zQkeuGP|W>w~4 ztImjSO}3X}$Er$*ZK<#5m{;vHXt2-uN$Ebf6xXGShVthy_q$=%k@c+|6ZhV&eCZ&$ z{mPV3ZHL^XyjtH>4XdrGG{4-2$8*+8OOJeQX6tJ?>GBjY36Cuo-&fwf_aOD0S=A;h ztNSuLOs8y6#Z;tj3~pNdR9W6{KlA3$(H*bU0<@o+1yry2r*ui4W!t!I+HaB>a+v)6 z%Ig%yD2LDPHz$40dh*1cGdM9oEk$yigVXIi<%})7vJ-K6YTt8~X>b_BQg45JWfdsx zRF#9}Q5RY?ZxqL7%UK6IPq`Q#xKN8SefBY4jC1wNMJ!x2H}=b>SqgNWvVuCB4>hWHDN$pmNj8=j)*RoLhS3xE z4gZ;2RN~Rbu5}Hl@sZknF+v~27tD5h9i2X`MtZ&ob;nQfno9e4%{HuIY?$cXCw}Z< z*h0J0Cl~6UY~B+)E#R@!F8ZTcweQ>F;&xU@(6yga1CEKRO*PV(yVJqK=4;Ex_x1fOpcMI+^gS#g{2(G~` zK+wSn5Htk$2%6wdxbu78y<2yy_SW71_Dt2(sbf#~w|jcJ`#jI5=`>9gsNHI3lm63R zG&|+PU6mq4edJSz>k)AH@Qe1L(UuH7>RBt8fg^zs@!u<^nvCUwfoFI=RB^wbt`JXy zi*+G>oI!urN)@U^!S%2yn6SiD@oc7Shf*sGDZ4zH%&17AyI+bk0ijKmizU}g)?`CJ zuAV>4aHYv9;YNIe-aSS9iyiq@+KZ1MZuVSpx!UICc@98WQLj*=;4n^NS*WajD)A9D zEWN1E%oPo8{b5ek=QLg7{h5}8f<7qZMk1vg#e1-jqUd72*gYW^6WR<5qBSiUQG`(g zpMb(*KEfN3RP|U37j-ZSzGw+P5ovyYHNTC7-6KQ;nQ2@p->=OPfG+S-B!<9(`4=p5 zBzrR2rx7E0bnkz=i8^hSINmw)hYOew^+xDd`O*0OvA6q; zMx$%gGF{g?ugi^+W>(D*xVQ{xz))%LfIrM93<`xJz<&pu3@oYo7_vI;mLyX`nJriP z)ixW!PL!{;+P}}+b$Hmg`B6K@-S^LULByqR$AbEtc_lHZ;-yT>V8_6#cOLX6|@79Q{hgq7Lx!vD{f*?8k;7=o^Uw;@> zs6W^UTbTa~2g*I-y68_%-$lOKuU}01)Ivx|_-_JXWG5^CulQ$>>D!nhQO)H7jVcPA zv*$5IpH64p%S85aEbsV7X}?VEo(r9qX2r6TFw08Ib8y%6^4;JWH#<*PJ`^mq*v|>C zHG2M?s~r?I?i3@|<2#n^$qD!Xb-DeS;vb9#L{G82SCTV3-JS zzuHkjEz4G@b9BUW7GW;yRUS!Pz(%sni$Znj=JBNnN1na_ibR?biO8>q(#HSH!t1*Z zBJN*UUQYj+FO4NntPNR@1J;JY&3cLe*T>tv9lr9gkubR4k-fV6%)?hS9bf$>E_jzb zHC_jp58U2GZy4OFgnk}F@r_QhZU#H^F^K4WYH6iR8te|bJ~^b_;u--y{`xAJQCg}8 zCDA6xby@qBYJsQqZbtGAm2ws8UWGHU5;fc2Hshb!Q#%D#3saEc!U_N4CqWWRh1M6f zlS&Q01TO(U+FMN^YHQdXli=2TAPrHW7#g3x{V05@r3#1CWQ*PG|2T~9RNLW4(7XM3al43_=MnB1B_=eHNK2q{H{;9mB1M*(*lO4}x_2=5gg!tN ztx^C}6y&C|W}Zzj;PTe? ze);cAc#g>-J>4HexvbD=q~+d?MD{Duk_*24Ndi=(q9a~ z6U0nN*&_~uK9;^V298gY{=nLVN%1URm!2S9$lvKqfy$7(Kb>J&o+jbh zlkAPvlCe^C=Gak*M`}B<%ED*z5*Bb3FfU}(TG)-oYSl1*N=ucJ+PPg5g!IM@J;NW? zwXfAKXfIUxm$Az1Fr}{_h>QPC5srL}9|1r*Zd^N^lPm#s1^=A&PwzqfkMW4OZCy?7 zW~|KrNV(Jhi!q}!{6K@v@?>+(zC4)3=Dn)(3Ux zFeWd%ivUF>3sj7mR28j2OwT@q=P4hQk%BLk0Low@%3ABAXT7??A)g;M?6uG5zt(=y z2Kt2QA#MIGUo!{yaVfjv04cja+85RkCk%}%%4K-a-t-ldGVrAsfIa7xC4;C)=;=4p zEmRg49KW3h>DW=IXZqOzLxy|&9t(2YezY9)SxF4Dtg3d%aS@zX0-0mKL!pe<1hKcu z+--sUx`j{ zZ2brA+Zfbx`Ml)@>Yo_c`Fe=8j@N z_TfBM!qb_Z16St&EDJu4Ffo~|V__H3o;p?#;N$!EAp#UirqLRk9}g1{QdjD}#-Xc@ z*K{Cc>3-cG{D&hmMq9m9PtpxjxwQVbuC>v=fM!UBFdtur_%_ym8WwzU$gou}HEQcu z!H8&<{-bGt+tS0{z$otv7ANmpshbGh3ui+F@&j(L`yJ0Kxh8&cl?DlOco*}F7s^U8 zxZ(`9oo{mZ>A?l`17Gf6JmkDPkA6_^Ci}Gt*^tXcva0yph^d7Ch-iqnE1BQH3%`Fu zljW33S@>bcX#TfTixq%O>0~_A=gSRcjdZrfuN;->nh4fEnwB2w77VR?ASB8+?>Qd~ zBHG9cPAj4DThgkH`5_{v1Pr20xh2!E4oyL~GY~fbnumIMj@Gk`zMD-Q2!wEDTV>WP zLV@7Z^wp;VGy?gF$4Jy!2deDD(D@PQ@5-Xef*jr}#>AO$61lI|kPv=c1T*)ISze9w zvn~@6`FVObJ7#5%3VmlQ$SWrNl{rf`-T>xi&J`B3_#@AxH)kIzugKXb2vrQ{7>Z{B zR|?Di7iAvu7DhS&f4eT%Iy7FR(J#2gK@gIs2s9ZJq8i2s-5N`bB+JMW9nlHV4$)o9 zZt4d#xNkX|W*U9z61kN4;QxC(I~yyC$5b=OSqtEIUq0BAn0=PI*ysysYmzB1BJ{XX z<(R@_G<+#te;n!$?_u7esdwF&RQRi}c60s(Fsn@%=2c;}^nP01V-Y>{(A;A3jE;gO zWNgg`>0j~*faC@MG9v5@Y;ODBbUOM;YrjMNmH%B$d$oK;f|Jsb^8wkO;kuA@TMFLU z<-Mg*}-AtpERBh4PF!%*J9?rf@lfP4tD3sEl@ z0LtzTqJ++JZ9HY=?#6mD3A*ob&0`4zl#!an8aA*Nh3iEsvj@p-Np06h&l{c94q8!{ z=F)(inorYEyq_O30Q>k0BM;6ls>jj7qy-g&7pwqlA43Vv!OX)rff2?QtEY5s-wDpq zt529~XS6uLp@!V^zdo#0sO^G>0f#5-SD1HrQZ(Up$0(Lc@xT|T3=7&f#=o_ zPM)9?WpS~mZwpjlon)js-Is7~Cqz{DZ0@U7sRIPiYFoVHo*v`h3}T%~;Hj4d_aN` z^SaQ63Wepw<}5tN(=Jc=5BiQ2piIqjo;zNBKbZ0e%`t&PbBOZLZ8PC1q&&HW9S2_8 zA$vMf0gol)qF8_TTtyx|cr|R{{wlK+P}idT5{wHNY`5>^jJ3(5Ph}_a%1yQ#$|G9o zVm=wIj#Y6B*lC4_1O@O;0w@mMn(!GIMu_VrAG8$i?C%reoNQ+kUWvWtNuLpUo(fEq zI>ap`{5FZBNpOkqSNH)I(NrW4=|bF*Np=6D*7N!nT1R!kjWAbKS)688G5bAWDkz+ay{*mRB(9hHTeZZ=lCH%QAg<^6K4(egxUCW z67f{)&heN9B7`C zn@COdUv+ni;I4sKLYX}s1dJ}wP4Pr}3j!NA)wUmAcK%CDixX@TTvT?ZW5}+h2DZeF zktJ6C18G9>h)SCHsrx5~Mg)#XeGuKEe8T_)JY`c2uYR!ktA0(tdX%jxc;kMO^IV$t zQxGiDGl-48z(94OmKL~b#7#r6lnGu1H?VEkUdmTT{V;=6YwJ+rU%49Ux3udmShwxu$8yGOL zLp-y6)YR8@)S*YK6n&t(!82?Z_(I&evzn=MiD!Rdz9-+G%N`2qG{0$Syvhn=&-%%IJB8#Yob?=nkY|2%*ErO3!vNo`3x2K&3b zm;-E|w>MhSjN1~=p?og3Kx$MTz}Tvo)VdU6zPW$g%9R+!arLV*ky8S(3E#?n|A)4#Ws*wHei9^Ga<6{N4>w^Ctu?VZMiJ}g7ePT!WTgsf5=mld`_BJ4p2}O z9S#Y=7w~c>O5odK+0pJfBRu4V`>tlxadaf<`&Z)M+ofo?)_$WXLfI@%t18PqMml7I zOvrqHZlFHSoALXZ8To+AC-TdxA|9v0AydL2_lN#ZIx|r`eP=hb0CPVIGU>UI`%&|` zNn69QsVIk%gOAyQ4vS4}qLuHzO3nS|^^Uf)R4a%qEztk$w`@<8k<;hDf2k1IHm?Q% zQbJRxK=gopH;q#8IC&~28WYlC}R~ZNYHWKWe^XGLBZBRNVRY!tZYD}E?q1T_!1cLM1h(cD&tJ+P(?3s ze?4Eiz2OKDE@f;Q40hb-$Z#pMR|7B@MdFCdMdc@^8p;=~^Uldnt%s4&LWObR%Im)- zHqeu#2m>U$l5HT^`XvXM&-1M@?bdK&H*f6mAz>3OebRpBmw-8x{x{Ucdcq~55lJaM z{+YHM)6?I%y!EG0#=dbz10#lW&p| z=i*a>R+EXlcj2d~sl?ityR`hrL4f*Lb4eyB0O#UQ6xiT1*p)lX@~igo(aqIwDnMWh zcD}(*Z>w0DP_33e?K-tHxM;jITUJ z(cY@O(VM~E<|ln9+e)qTj+x*_05{gQBP|0}BGn$TY*RumKy(y@4XEHS7?uoORV5)@x%Bg(#B)kK;=nwzIMVA*Nx#f z_`xUu6yspagd2l6K?|yk0aNgd#+T`>Ch?!GoAYrfoK%ejF=X348XNbpI;pz9*q`kA zt~%XyY$A@=G*8k0U}{5Pu|#q-7>MUrV7z#Nro=x%(4{=sZ+N!9f&(BaqpUFPM-l03 zdI7}{(eoE~jZRquyr&4(hB2-R6{OrIY=eJCCUz8~U7z6*PL2Bzr`&auxREAR!i)&ral!C_m!XS2CTF zAq(Pe)==~&ZgH;dcS7LCgPYlv=D^>2SI05D3Zb}1ECq9$Nf7c_z_ZlG$~jrsI*q8i zpUvIvpIE~cb__K0ogZJ8GJV`Os@8l#+LA$(|1KNX?_R5z?BOTWUKW-PWI{@ut){~u zS(q_$IMA@%KlQbZtmpH(;EQ3R>@m;uOt7*!#M*O?8VJ3zS^>XJ+nh}Nd^?t{dTbVn zAO!1B$U37Uc&9cHJ^>>ti_+g1-&sY~_HelV`C0#zAX{A~ly5wFC^Oo0ysuTuG07y z6iyO#9xlh$MU$uWyFY_;$g!gi-XX%ktW8K2c#1Bwg=m{*i_Z^arK;M(-^;d!$ITaL z`QLO53qi|M;xGVLvCg7Jvf{nWhrtbwmC#A>CL|2V;a08gDh7ZfevPG7_I#^9UN5g|nQ^~uE?#54|;#U1B zCb>P^^vK1Cp=}2jYMIcKyhoYvlx;*UnKy|cQ0Dn6=R1R6;5+|+>i;qcUn0|DJ~v-v z&k_fCPQEx|XQ%*QRd^`=Wxooj`TaMc@~zB2>qU-VzsS#6R(u}U;FYjK7G+kKR2SCt zGGH8xXKzeoMdto!?2U8t8zF;ZJJP)P;CqFqsNpsqrw=$JpuOnlu0RABu-C%z^SQN_ z_tFwPzyIT(fbMk$pHYJ!vhad}+3nMh>Nn;_EHJ@7a%e3B@jD~d_(7~MPRHhu4SW3k zn10X{p<2c>A1#QQ%=R8a72w0Y_0N}#F42l8;kwwtL#O+VW@sDx8nwfs^8FE?h?x!V zQnBshpFV9F90ty~!t^)cDW)vWfk4*pV@{xxmA46@`f*GlBn-K8C&LEWgV|?@77BxA z-^6nS93gn{$4<)Fdr$1&NXdGj`-wy^Ql9EawTj2-x>@|Cg21`5LrRT$bNrseu!Uhz z4I~i6P(>7o8Ty;!_0}?tu$fzvYYs(><8&F+J$u;ABs`4o2hW}EjgZH5+EnALDY776 z6Msy{65`g;0UW*nL?wERFnWt8Wt&v1R?V4DDLwYnr_N{iOcu%<)i6$}7Ga))65*s$ ze$+Bh(nB0NljeLaiTXq2_4>WPxhS7QF`;v(V>QkU6irUdmbOhq5EyJJYbL)Zfc+yH z1ZgzYIY<~hlC9Ef4A+->kx#^z2&qp;36-}1brz1n{45I}!ngTSQ~<~Cq*rj=@kB`& z7I>6uumd+-t_Glf$Nd406H4g6p%oT5IoBfaS7CrOL7={35SKh7-Ff(2?p^`~O;Y5z zXY~17VR4^p;|A|rx7#1|>7}oTBCKY3`b_bH*s3Fk1PRfbVK{lYR%Tac;zXS?*yc(* zU*>J+(s^isp?9`~aeKo7uW6Ja9r{3SV$X=8f~fkk_uF6K9$`cSZEh~Ej5aoWeGoreTOfU4#z$0*8N65nsenX5du?yGJ<kZ1xJ<1VqHm!ppm)}FKVyHL6gPI0IS&TWNKCyHxw)5j zwPM-WP1YLi168YZ=jV%gL7UKFVqsDupW(Y(fI9-C4rF^kpHi_m&B>Mm^Yzv575?XSrNKNBz=USFaR*zl({*`r;3;25|LB$ zEJLQov{Q_JU&-o#OX4U9pXhE|fGFtCFK;+4&`)cVs5+hQ5uLt6(0X~&3!byUtFvy=8eCjTK_wiO)L&vfHv^WFjs~=^pTZ5{^OIz zV*wy?K9^9MZK+4vGavL(I}D0FTLAAG4czBv;H;*m43UMpIZ$pRN8~(j7aLw?KEklgJ(dLK_ z4-ViU*V>e5k@zM_^Ru`TVL6HOVE-1YJpR8qOL8Kkwi40Ehk=a^jCEhoSP26H5qL!w1K z8%g+T!v??qv7Fm``dx~RvuIM6U#KUI0INNOzxYMd2|PXA9Q0{Dls7XKbf$8Q2hg^A zO0TpxVxdIT@H2MU(wxbnxt+VsTi6vHAi_i9ROTMMoXIv8j6PDLOJoA*XpQSX>m)2Og@&4|?+v?V0!PUBpnFf%{f9qJRIAXjf&c|q zu>iZ2CE|Ys|Ar8~&lLvxEP;4$@C9*K(rFw5NtqmMTgjPEnO>)(aE9E4%W~s$c zarYv42W5%TOCD`>06dfNl{xWN{pnB}Ew>jy;wC#mdJq7G46Cm+9|P$b>5J{_ zi_;^7Nf=pFlKLWaK$m11&1%1f)=;rPBvw5!!baP#ByrWxE2Eb|*-$=i^pd&)&qiRq znCgn!j_#UsxS#aeA`zL0YXfr@j6L%-t2gFI>}v-xEHdZj*+!sHRxJd!z(aNXF;p(F zA)2&LSWT38yL@{D6m)F;vZ|~|gDzR{8+aGRPwli5$P_Ul9SJ~%Y&;|tqC}~VIJUUR zX2J@ycsi;TLZ)3Ol4^Vw7+iSvI^t=eEtyjtYLAt1hul*HejS%S(bz>DPnR4T9Dh%X z>h9s|itf8*smUR&yNi0Xzq2?paxA+U5iBECi%|Wjm^hz(x92?(5we_Ih<*Kg@)I-9cOD&!n#Oqc%9k1Oz3`h7 z%T+ghFw@TQmfJ^PZN~gviUQWO=}KXb&jJr zr2H20A$uVYEM=skJ3`+Q@tZey8zlEG2X5NfSw;&CW_l_T=qGZw-G{!R{CI1=sN9!} zu{B=ZZYx+z>o*@)q=ymA(lAa$J`LBquD%|t4+xpC*Yjcs(7y8&35i%6<{kCWZzN~B z!#{5dj#;hm4HP32jkm1G;Z?V_26BXNpnktK110s3B@N>ebxyxX@eY@Ie`(>lvdQ1w z!$KmE&-wGs`Qy349qvJ=0CB;OfFYgFvv;Mdu7=cv8neNAoikTIrsbFe?E6YIgbwNQ ze_!S5lZ0%9;zz8`&0JM;R|4j?y{#V$+KnFVH$vc{`$|%){2h<$C^cIx+^>oX3CWiH z76v|Iq1}KHG(Rr$}62n0ygtyQZc^>TkP8R}P$13I6XF_fm^` zK?z+vfwcbU0_9U7Q2+#2$eO7n69g}`g4rq+cjgc72bj9>V&a#K4^b7PyyOt{R?M@6 ziHRvGFv$iYte#ko8NeJu4^S}UiPt9|Eij#to=Bpvy*5#l7LUs(xVhqsj|@%y2*d~U z>TKx7fq_s{7%_G#Vf*T|Q90fG(ULHKvKv|T#-=CkdsZWEW}zbh;ZS%v^p*@@+W|=O zqu&TDFkWZkY2H)211=7E7hmPS^XH2 zAJ$y&H%(C~Y{EPy)&b2e%s=fBx@}$xiNj!J^39&8MAa=K=ff*$JQ761zu}Au7*;lc zb@pSrfmf^%5Sbxf6~y6Yb&$0;)6*&DpUiZfbC6vZp&*t9#xLOhad2+=Uz!l12%n+# z$?q@6z`=Y>MZG8(DXNgE8btPe7cK(`#{{Srd|lMqUZ;>-lkQds z-Fy0)+Z;W^^%u5WROBea(zE7^8GO?o6G6o!FC%UXoG~1?94+|b>1nP^IL^F)W9WS~ zR-G>1$J%F6u@imtT140Y^vX!HA6#|cu-YwjyPr_X_uIDgLv0mjJnTk1HF-ye ztqsFXvri|%>Vu0x@j;NUA3V3}v6;lw;RC$oVO(Xizo<1KjY;A~28(kg@AAzI&spcB z_7K-USc@f&glWLOk~ed9qQ`A}W(iu)zgpZfFPpvX-hLv=y@?Jp4v#T04j(A+Oi7RY zF-6Yy)@^h(2!=(hG{w+5410uEU_X&XYKe^i6?i%_>e)_A>_;&Y{{p!7Y}W?nUGL@8 zNk81pYOP<@d>{FtTBXtv%Mv;luln%)(G%(Kk2et&hNHCMiOlk3tk7N=+W|!&e>t;> zTLF2WFb)X#bf~(d41lD zqP39w^Yt}c`iaw*F5l>wpBQB)lTTLaS+1f22!+14^rDpUi&7Rg;f~H?+!aW3su=Kq zXiNeCccwn5L}LXNv$Q5RkN6?JUZBo})VXohBpBqO#wlhRRW(ncE75Xwhr{HzGFHJo0)56DbfU-XZ#GkN#J?7vG3SMuiI78>y0Wh>dQ&vD20EPr|q?lTA!)1ZT z&3@ahzB5?gaT%>Y?YZgYB}N_YK?vh)LDL1oR3bVt-7c03>QEWk#+_sey9v~$QiKim ziY8!z%I`+u9VnRvi|U8%%K#>-V5T)(-#kx(_(|-S*>dyQP>Q0*z2(fHdT`|*7s5!*NeR0 z8-whl3K^6ECAd3Q2pAj!k=a}8;`51y_QENq^6MT<)xs58#A%MPaVw=8NDG_L2B1T2 z8>j;3GrU*M46v?t{C0orgE9ay<|T^N3wV9+wpl%#%F+M}Z{hdzU3^=8u0V=T8G+io za4hw3->=kh0Y5n+ag=9fPkEY=kOMpM8Ke*u7G5dnZyFbGLu3OB=| zF7+8Rsv*_cXrY!ARGSnpzvI79LP9+10X zoY-_+XOaR;hS2~R+-*ulnIa9xy^V*zfR-wXCxUmY98y5+ri+&XfgoK#5deGuiUS7y z0^+;)5y=z<-0hVk>yZNF^#o!3@N+tla0JF6e1|M%z?33o94~guxPO5tyoj<+dh7RB zzF@Yi^>s7qB{l@qj|K@WN6@k2?HE%$2=g*@wD%#-p!r*wxNs%(SKtb}E&{fpf`D=m zLBXjD!=RhT{tYhqwC#P8D#`G>uUDm5Yu`YuVPjAj7%1Zgrznx+#uvs{#w2){3{HYb zLeiF_d4TW&6q*`_wN)RD=r470pCWh-GNK!CGZ2@ETF+Z?4 z=KXqlEJ=`~B|@^%12P{>XN9LBF~y0JDd5W+JSQIllVR8_RrBH_7O<#7ctDiv z6ZZ$Fi(wv`4`B*1v&|&VzXxNd?q(UW0Z0pQJ}?RZCZhwzamFuGX-+fLbpQN&FAi`A z!2E>3?$8wg#Fr1(pdMiLC9;rmF0lLj7BDr5>n8!iM^Ph@asvqFPkvVXA<9N^>!-WP z;G@p`cmN1yuFO4UNrU-3 zv6mQ8NWcK@5OQ!lvf*XN-cz&Xo=Zvs0E9|D>YPF>ih<(IwcY(eXs-r9mO0gk%#5nK zb?<5Zzak(42qLrPhV@$7^BM8RU*2`EU(~{-gD6S}t2-#JnZDrkFL$k-VytLe!iXK8 zqN%R>;H!I2d-5N|fpy8PeUVr+@x1s;a@{xaIB@Z!cRGAjrId=vGM&F~F9ZQqC;l(r z02N#G)?GrGwYdb4D1~VzrraPCynWBa2NRf9$mYL!BE>nT*nQ@QS~O0HqMGZw_=ivc zX8V5wMqv(X`~E+eQ5Z(8?f;P(<%wa`dSN~e|HY&A{NFL7v>N`yS^EEjOnZW{d;DL_ zs3B$=(f@DEC=h0)wg0(+!5A*|{{@NqzjyxUNet^4_}>@*hgO7nIEHJCS(5F4x&42= z60_gh+FDy%YiVhT0X_Np`Z_u~rl+T4j=Q_NV*)HO%qShq6fFRNfhUxdl;q~-V!pk+ zya)&g0s;auGc!|DQ(wP+&A`C$_U&5?iYhTN@%{Vv(b3WWeX6XiEHpF}^Kf-_^~lIb zIyyRWad8ZC%E-tlFE0;c7h@|aDM>^`L`X=;&d$!;+nbk{*TuyJW2m#U6LShcgq$s>mEBq=HB=jV5Da4~V(9+Vv=zz)l*49=+Lc-C}QE_qcvuDpd zJv}k%DJdzfudidEK{Yisb#-;+<>kMA{hFMdl#`R&-`~eLwr6ByG&VM3RK*klMwaI0 zW;ZuCjHH{Jn;6&zhVJ$4+qa#a9Sppyt*vc(dU|YZ41?+_C@8?lh!J^cXsD>DsG*@@ zU|^7oiwlGQ>gebwEG(p^rmm{0K0Q7CZ(%W|iSZ(5W@et4n5e3%!W2YHOADr41_lQD z`uci$dN8aoOtrx{g`b?9z+f;8?U{mtf}5M0jg1XM8^iF&FlaJNmCML@i@_OS=wz&{ ztk~Gt`1tsk+K3^HVXDFX{r&azHHI^WVU*q6++fIK`H;WE7~vfLix~yt6|-iSM|oqx z9^v4VQVX$A&?#{`a!W{SAx!;^nSu<}87y7g^biPtgug$+)89YPUk9;=IPZ!KJY6e` z3-|lATAuxSX{5d+!^>5a?)qrFF)PtRQ;he1WoBxmJK57r>-2D?ul`DOhz=i7}nZ+*QN+wE&QqHu)6a{3jR5_&tC@qR^x_lu$z zjp>s#!Z+*5^d=A@)O)XXgmNxle|Da`^k3gbDD*d;`wd5UO8vd`&%czM4bHWho1I;D z5;oyxpM7ia`nR`t9S?nVJkH+9re*%N+41@Q{Pm=%XxT(IH$~Ip%JTAT|5}yWfJ#@% zr>s8`Uw&dL|M&TxjIk$9r8B>eza~aHa?|7zL`#4D+UdvtjE_%LRN{j&>)MMhi)Uil zs-^Fw6Euku{Uz?R4@>JzIy#;|U+)fGUR+$gY0o{zPb_0!CnW0h6QMO(;I4T)?|J%C zKdqTXHSPUZ#r3Z^$Oo{n7UfD{>s)oEaE?Z7<)Zc+_f>s3;q_i0D6@y<8bd?50;Mpx zz7Rb9KDo-6aA)P~#5qfJoHGDN&wZU4&3x6u^z&^TUHy{y+kT5r*gsS?m;%=6Nf*?E z-<$i@y>e20KVjM*_joJ&ps*eLd9hr#5zS+NZfsEjoM3D}i1f2(h!e=iOr`SSn_EF^ z+aHqr%z1dj!tgnmvh|u5qy0YDE}M8D+9RP(7rHHw+O!01<#YBN@|ALYM-g;%GAu&Q{j@QSj|uG5N? zoz(4f!fDiXPTmg`{nALP5aDnvuoI(2r7w<9^E1Mebw+eOrz4Nw##Wc;?O13|Q_{pr zOV@58JJO5H>ahw!>>J(A%)%L+uEk9Y;q7uV#>OJ!#O0^?>Bs1T%j+?#_>}>Q*)R=* z=I%i3n>w@zTh~^7xq`?W{&44#1A&otY!4p>>+g#TlONRA{*26W3SF#lKi-EgzZ_jN z7#%LBKO?`ZMHamloC+0h9xub8LFK9(d=yuOKmA8nNO#5>0SQX9%2I4s9LOLe(oEfBcTsi|15 z&65eFz8ra`=&IooPA3`mVe3aJg}(!%zv<{amDrY?9qCSM=qq|JB?xQoaH03fpI^l5 z13!ZDDdc2$2i)1qQi7RBLQ?!kUae?f4@9+nYtL!cauzS&@yoL&y#-{m`-HJy*g8ng zqw9slX(#`@I_{6u!gWbMr~U2cn=iWM6nAhE?~1*q6=hT}$U9-PUtKM*PyBNG zIkY0HRX6jLHLf`J*{NxtJOe{nqB;|;NGiqkzRv?y&zq1q*PtOA*7!qi6BlbuU!KR6 zhyz&QVDM+{Db>TE`LADdZr+8xR+pad4iP=ayR&b6*;Nh27{%Ms7rA!VfejuHGFzva zJ;5OouhiE+O!mo?A+4^kaZ*_UP~>Z;xDzsy0*}L!0?pt6nEb{b5{f8xeSr zIxa1~YiOck{LqZ7ir)@us#8^aB9MKTt%8@tBWf@z$%9KV%X7M)@zmD46r67|JqtZ2Y zuH4Q3%RU)Pj#So0)I7G)x^xaNg>5Oi?#Bi$jkZXWdEiGlvYZXSxCmdZ%8silkel7+ zos2Xe-X_g2`vkAQh>E!Ag8oSB{u>W)HwC1TwvSAcwaA$z$xw~{v-$mst&UN2U zC9yTK@-0pY&29152BshE+bzu31RryZP7!Dj6wL(xsaA~t=|!5o`nb+aJali7R4bdZ z?x!1w-^TL$w=xr3R3&Z7)xo2<*|dc!0h}BY+aXV*e*l5Mnsz?5-5$XY*W$VHLnY|4#~4vxiG@BHETJ67Z3VZh z@l?O1V|)Sp?gcVsfAw99j?^`-!h^*HZ0sdO*XB!YRdk_qWZ;5XB74^1`w#C>0qsRDkD7k(6!W zqvq1VyNE&K0&EHpfts=2N?$(pUOUHlAxqCSFU3T<%!El`M-5|R%Nq1AY%#OUft!(q z7V^x>a>VHk?3t;UC7dMO?=6ibxZZ~87_VsJNhZbV)A$=A?x3l5*Y|xEU%NKM>3aEy zYF&*@YQGy^;xOjQ{c{}{u8CMx@42eTDro-O{C-u7MW1RY=ULVWJE)4*r>=8jLK>Y# z#rv&G5Ytx~qT)?3{WR;Nx?55z=#ol*({Rt+GUiO<*zhiQX=}!j+}@asoE&P}Y;h*b z8sZ%A*KFf9&$CQ0G5}aD?V2Z%>whB^s5w~=P!&mi)DVkLbE3;E&GvqzfQg)WmE*Pi zuY}v`-$@%QU@gKZ1k;TE4{t!VU{ExBsw zhTk_gp6jMGp9qiS(%*DH=eri}f9+&nvR)KID1wU@bH_d}SIbM$b-e53Gi9B>BlW>dWn?_xUQJHNySYWd^5wi&Esh&BZOXO5EQZtgv z?1!JW!=BVYX=$gjEquk916eQ?kvTbWfsVGGSUvHr<=T^&B96OIucE$U93{=qX(wUB zO%`?t8aJdUSDoDsn&kPGZl&&Br~XA;8R)LRg*V#t@p24WFS>QE~&k5h)&RNvw3 zY-PvbR9eCN;&kz2E7F*7SY~<)Xooe9#inhW#JrqK`%OsaYx@MYMNCQGEEO~oItNMd zl=B(kg9vW0Wg^Oqb!J3ri^z=p(StN#FI6V0h*3wqCM>cUJpzP_Q!@*Y>9Oz0KWuvMH61Oy@ML|Io(> z^Ts^xaasmx%s6Sz2qb;PA-i6<{{15XX)0hmK5zAGyv=Dajfn3&S%d9}P-@AmIOVlA zEq-gdXi6G)DNt!Su5d-?IYm%8!Q0KF_7{DlWX|Ivm9cInj;(JYE49tUrbBwbQlkOt z(}8!}Q%39_H5Q)?Xyt_~4V-?Vjz4S~`O?6xk$-V$ zi&&+TX>4P)P$w2w@fXFA?9V|g)TNCuCyw#+$g0?c0k0yO3mvggS+1&96-b@Zj~)>1 zh6Gj}F)NYoKf-o0-Nzc<>|C#|7O%v9KII6Y*l#?cq>G6wTdM zw;qGA!9EBGy(P`6lU=iDB2VSWF8*$iJ~|rWBst)0;*{Q5=V|KEVyrg)+VRr|bwx3I zWG)+L^V(9KcI)TT#?cRCz0gOB6>WDt&g0F-KEHTcjD^|dJ{i1Bu4qjX80YyUoSA*r zY}{n6%z5wxy6Q@)%JQR*e#pYkWTUft3rXXJ0Cbj z7dNW&jk@Xf=|aZe_h9>P_ci`11u~*Tr#2fY+EJr#)RPj8H+m99E(#hoSxJxzt~V0| z&aaCM5m{!cUUSMu~dvi6APT?otHTx{-8S)bQ zefFs*j<{!6huz&@vErt#ziYZ;;R&d++p39izM>^D#S@jVG5zQXh<#_Hht-ewSW=^J z825&k80g$iJJsHGQL7rM9H|?4#5O1IdNCVXq-k+jF#Cv=DE+1+!IiXpE2vHS^4EnZ z>9d%EyEQ>|7H0UqZpNpc8)B)fqAy+y3ak@9BgBYcaOBotLYfmJEd$t3m;Q4 zI3DQjGcaJLE>mr!BJ`{al&uvNWg*Oh^1rkVw8h%QW>j+sA|YNcBOGgkq7_z@<`M65 z27DZ%F0tg>VxCwSlgvpbrblV$Kn9slIKc8{Bf(GDlaljtgGL2>?xS|K!G4k2h{h;& z;+HautOAP8%uN-)KJ$t#UH_+LA83o@TIhYFpGV$Vd^%D?K( zVxDBRO#6qKL}7VUVPaUuZIv!^i4p+5eUiyd;kgS+i}rmo!vWksEon?1e$N@8prbQ$ z7DrSlaCoO7@R1{6z+CL@y!x7>G_zWH{R7x{@q`bnX531n0ePfA74!Ii z5O_`)#-TL#Ha~uB7_pBvo~u z-@_COOd2U;l$hhaJ41bpoK{YTzYp{RNr1LvM3D<4dJftAuJgv0Dt)VCmDX9A;~hD* zeWR1t=`03(lk69wi%ZiURfa6vjGZaY()<-ougOrB@Tva=T<>@5ei}lk9OBI5jLtmS zl0S87!G$aLz{)(&%VwC__2{x2a{@cVcP%sDys;~nDfwe|?vZJV>(2J|+j&iwN!>i> z{v5Hpd}CwaH!K6(%Yw3bdOCUwVEVtw zl$#&z;`sZ8cQYy$(ATqhGdrDjnV5bz7aNBY)RG~mC!){M%s-YZyv=!+=Zf0#+_wJ6 zu~wG_-t!T3KfA`%`Vo22p85o8R<!AM~0}NOty) zoGp9}%+rGS*wy8;@GVRC)wv+n+Pn05POTOK$iLm)@bVblxHX>}(qm@(HmxCU6qo%N z`a-9J&!6dO&AYN#FvAUt7nB}w-^%d=%Y*1UY7<*ZKrNJ4Z;JriSV#yu1{PTXT0)sC zrX~!Z5M3r>W@(j~U2pru_n!PvD26lj)nt2~;qLj-Zg$FgMnzI0J>Z5;u{`j3s~g%& zSZ^=B9eV;tcZo^w4W4g?{uAZa>-4(4PUr6%wcngHlV=}ZA|)bswO2G}=xgbsV~-y~ zd7}#-Ulh>>*MK?x9^XSR6JCy?3LRt&3~q7h$R(V~?;|4VEY zDf;*49{9My`-VxeY|iD?sDpGDTnI{R*fCJ#flrJufg-6Rz&LMYp*|gs4pnl`cuLi5 zX>axVt04*Sc=57~%{R)M!;0jRqb@N*^fnafuzvTJ@OW9h>e|oicoq?#h^I$rp;ni) z^?Dxu^up6!>|D3Z(S2$agb{B-ByFxZptwo|5nZBbj=D<{y1V_acAlrf_6)o( ztUMx`v;dyWAbeTDbDdD?HkopLt)LDn(YXE%-LZ9gl}ul^<=u(Miiuh}${YcKLQ+jr z#zuppp@VHeBn4~2po=Oh`ad*W@ZXJ(_3V@0prU9VBVbJENVh1Xr3leEO)Xl86mySF zMVX1q#{Z~?`O2nl&Dl4TyO4in7+-P)1$AG)`G4Qf8sbQI4ThB>a&6d$hK!+2W|&9|+$q7~_DnV#)<8c_8X&fZlcIjYD2qFFJ? zCjLFTj6sqN`ColYsAa)hyP(@y2Ub2s0Q2cvhd^q-8>NYMIwf_G@l2VD-8jH!?%07g z@5Q?YnEwG#cz8EDKO3s?FQfAAm5!QueDy6?=SMrJUi}JW5S)U#Kso1cWQ|rKACf8b;DbqQii-C?{-F=9~b{Z@B;h~=q71kHi+UJ zs?ITxG9OQQ!p=(%xnrtxYKWOy?7=F%^TlSjDt4zG;SKc#sC)D~2fEMJA?60q=gX

T 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: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 literal 0 HcmV?d00001 diff --git a/searchwindow.py b/searchwindow.py index c45c86c..e9b8159 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -17,12 +17,10 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . ''' -import sys, os, urllib, json - import xbmcaddon import xbmc import xbmcgui -from functions import get_filesList, HistoryDB, get_contentList, log, cutFolder, get_ids_video, showMessage, getParameters, unquote +from functions import * import pyxbmct.addonwindow as pyxbmct import Localization import re @@ -46,6 +44,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): __settings__ = sys.modules["__main__"].__settings__ fileList = [] contentList = [] + searchersList = [] right_buttons_count = 6 last_right_buttons_count = 0 last_link = None @@ -54,6 +53,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): last_top_button = None last_right_button = None + icon = __root__ + '/icons/searchwindow/%s.png' + def __init__(self, title="", s_param={}): super(SearchWindow, self).__init__(title) self.setGeometry(1280, 720, 9, 16) @@ -64,8 +65,6 @@ class SearchWindow(pyxbmct.AddonDialogWindow): else: self.history() - icon = __root__+'/icons/searchwindow/%s.png' - def set_controls(self): self.background.setImage('%s/icons/%s.png' %(__root__, 'ContentPanel')) @@ -116,7 +115,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.button_controlcenter.setNavigation(self.listing, self.listing, self.button_history, self.last_right_button) #Main - self.listing.setNavigation(self.input_search, self.input_search, self.input_search, self.last_right_button) + self.listing.setNavigation(self.input_search, self.input_search, self.button_downloadstatus, self.last_right_button) if self.listing.size(): self.setFocus(self.listing) @@ -155,18 +154,15 @@ class SearchWindow(pyxbmct.AddonDialogWindow): query = self.input_search.getText() log('Search query: '+str(query)) + searchersList = get_searchersList(addtime) + #cache - if query != self.last_query and len(query)>0: - self.filesList = get_filesList(query, addtime) + if (query != self.last_query or self.searchersList != searchersList) and len(query)>0: + self.filesList = get_filesList(query, searchersList, addtime) + self.searchersList = searchersList self.last_query = query elif len(query)==0: self.filesList = [] - #self.filesList = [(1919, 1919, 52, u'102.66 MiB', u'South.Park.S20E06.HDTV.x264-FUM[ettv]', - #u'ThePirateBay::magnet:?xt=urn:btih:0792ea51bc16a19893871197fa927ecec7ca25aa&dn=South.Park.S20E06.HDTV.x264-FUM%5Bettv%5D&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Fzer0day.ch%3A1337&tr=udp%3A%2F%2Fopen.demonii.com%3A1337&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Fexodus.desync.com%3A6969', - #'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png'), - #(1919, 1919, 52, u'102.66 MiB', u'Haruhi', - # u'D:\\htest.torrent', - # 'C:\\Users\\Admin\\AppData\\Roaming\\Kodi\\addons\\torrenter.searcher.ThePirateBay\\icon.png') ] if 1==1: if self.filesList: for (order, seeds, leechers, size, title, link, image) in self.filesList: @@ -212,6 +208,181 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.history() + def browser(self, params={}): + from resources.utorrent.net import Download + self.right_menu('browser') + self.listing.reset() + menu, dirs = [], [] + contextMenustring = 'XBMC.RunPlugin(%s)' % ('%s?action=%s&url=%s') % (sys.argv[0], 'uTorrentBrowser', '%s') + + get = params.get + + action = get('action') + hash = get('hash') + ind = get('ind') + tdir = get('tdir') + + + DownloadList = Download().list() + if DownloadList == False: + showMessage(self.localize('Error'), self.localize('No connection! Check settings!'), forced=True) + return + + if not hash: + for data in DownloadList: + status = " " + img='' + if data['status'] in ('seed_pending', 'stopped'): + status = TextBB(' [||] ', 'b') + elif data['status'] in ('seeding', 'downloading'): + status = TextBB(' [>] ', 'b') + if data['status'] == 'seed_pending': + img = os.path.join(self.ROOT, 'icons', 'pause-icon.png') + elif data['status'] == 'stopped': + img = os.path.join(self.ROOT, 'icons', 'stop-icon.png') + elif data['status'] == 'seeding': + img = os.path.join(self.ROOT, 'icons', 'upload-icon.png') + elif data['status'] == 'downloading': + img = os.path.join(self.ROOT, 'icons', 'download-icon.png') + menu.append( + {"title": '[' + str(data['progress']) + '%]' + status + data['name'] + ' [' + str( + data['ratio']) + ']', "image":img, + "argv": {'hash': str(data['id'])}}) + elif not tdir: + dllist = sorted(Download().listfiles(hash), key=lambda x: x[0]) + for name, percent, ind, size in dllist: + if '/' not in name: + menu.append({"title": '[' + str(percent) + '%]' + '[' + str(size) + '] ' + name, "image":'', + "argv": {'hash': hash, 'ind': str(ind), 'action': 'context'}}) + else: + tdir = name.split('/')[0] + # tfile=name[len(tdir)+1:] + if tdir not in dirs: dirs.append(tdir) + elif tdir: + dllist = sorted(Download().listfiles(hash), key=lambda x: x[0]) + for name, percent, ind, size in dllist: + if '/' in name and tdir in name: + menu.append( + {"title": '[' + str(percent) + '%]' + '[' + str(size) + '] ' + name[len(tdir) + 1:], "image":'', + "argv": {'hash': hash, 'ind': str(ind), 'action': 'context'}}) + + for i in dirs: + app = {'hash': hash, 'tdir': i} + link = json.dumps(app) + popup = [] + folder = True + actions = [('3', self.localize('High Priority Files')), ('copy', self.localize('Copy Files in Root')), ('0', self.localize('Skip All Files'))] + for a, title in actions: + app['action'] = a + popup.append((self.localize(title), contextMenustring % urllib.quote_plus(json.dumps(app)))) + self.drawItem(i, 'uTorrentBrowser', link, isFolder=folder) + + for i in menu: + app = i['argv'] + link = json.dumps(app) + img = i['image'] + popup = [] + if not hash: + actions = [('start', self.localize('Start')), ('stop', self.localize('Stop')), + ('remove', self.localize('Remove')), + ('3', self.localize('High Priority Files')), ('0', self.localize('Skip All Files')), + ('removedata', self.localize('Remove with files'))] + + folder = True + else: + actions = [('3', self.localize('High Priority')), ('0', self.localize('Skip File')), + ('play', self.localize('Play File'))] + folder = False + for a, title in actions: + app['action'] = a + popup.append((self.localize(title), contextMenustring % urllib.quote_plus(json.dumps(app)))) + + self.drawItem(i['title'], 'uTorrentBrowser', link, image=img, isFolder=folder) + + return + + def browser_action(self, params={}): + from resources.utorrent.net import Download + + get = params.get + + action = get('action') + hash = get('hash') + ind = get('ind') + tdir = get('tdir') + + DownloadList = Download().list() + if DownloadList == False: + showMessage(self.localize('Error'), self.localize('No connection! Check settings!'), forced=True) + return + + if (ind or ind == 0) and action in ('0', '3'): + Download().setprio_simple(hash, action, ind) + elif action in ['play','copy']: + p, dllist, i, folder, filename = DownloadList, Download().listfiles(hash), 0, None, None + for data in p: + if data['id'] == hash: + folder = data['dir'] + break + if isRemoteTorr(): + t_dir = self.__settings__.getSetting("torrent_dir") + torrent_replacement = self.__settings__.getSetting("torrent_replacement") + empty = [None, ''] + if t_dir in empty or torrent_replacement in empty: + if xbmcgui.Dialog().yesno( + self.localize('Remote Torrent-client'), + self.localize('You didn\'t set up replacement path in setting.'), + self.localize('For example /media/dl_torr/ to smb://SERVER/dl_torr/. Setup now?')): + if t_dir in empty: + torrent_dir() + self.__settings__.openSettings() + return + + folder = folder.replace(t_dir, torrent_replacement) + if (ind or ind == 0) and action == 'play': + for data in dllist: + if data[2] == int(ind): + filename = data[0] + break + filename = os.path.join(folder, filename) + xbmc.executebuiltin('xbmc.PlayMedia("' + filename.encode('utf-8') + '")') + elif tdir and action == 'copy': + path=os.path.join(folder, tdir) + dirs, files=xbmcvfs.listdir(path) + if len(dirs) > 0: + dirs.insert(0, self.localize('./ (Root folder)')) + for dd in dirs: + dd = file_decode(dd) + dds=xbmcvfs.listdir(os.path.join(path,dd))[0] + if len(dds)>0: + for d in dds: + dirs.append(dd+os.sep+d) + ret = xbmcgui.Dialog().select(self.localize('Choose directory:'), dirs) + if ret > 0: + path=os.path.join(path, dirs[ret]) + dirs, files=xbmcvfs.listdir(path) + for file in files: + if not xbmcvfs.exists(os.path.join(path,file)): + xbmcvfs.delete(os.path.join(path,file)) + xbmcvfs.copy(os.path.join(path,file),os.path.join(folder,file)) + i=i+1 + showMessage(self.localize('Torrent-client Browser'), self.localize('Copied %d files!') % i, forced=True) + return + elif not tdir and action not in ('0', '3'): + Download().action_simple(action, hash) + elif action in ('0', '3'): + dllist = sorted(Download().listfiles(hash), key=lambda x: x[0]) + for name, percent, ind, size in dllist: + if tdir: + if '/' in name and tdir in name: + menu.append((hash, action, str(ind))) + else: + menu.append((hash, action, str(ind))) + Download().setprio_simple_multi(menu) + return + xbmc.executebuiltin('Container.Refresh') + return + def open_torrent(self, link, tdir = None): #cache if link != self.last_link: @@ -261,6 +432,18 @@ class SearchWindow(pyxbmct.AddonDialogWindow): 'Fav/Unfav', self.localize('Delete')] + elif mode in ['browser', 'browser_item']: + label_list = [self.localize('Start'), self.localize('Stop'), + self.localize('Remove'), self.localize('High Priority Files'), + self.localize('Skip All Files'), self.localize('Remove with files')] + elif mode in ['browser_file']: + label_list = [self.localize('High Priority'), self.localize('Skip File'), + self.localize('Play File')] + elif mode in ['browser_folder']: + label_list = [self.localize('High Priority Files'), + self.localize('Copy Files in Root'), + self.localize('Skip All Files')] + return label_list def context(self): @@ -450,11 +633,13 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def version_check(self): return False if int(xbmc.getInfoLabel( "System.BuildVersion" )[:2]) < 17 else True + def onFocus(self): + log(str(self.getFocusId())) class InfoWindow(pyxbmct.AddonDialogWindow): - - + + def __init__(self, title="", year=""): super(InfoWindow, self).__init__(title) self.title = title @@ -463,8 +648,8 @@ class InfoWindow(pyxbmct.AddonDialogWindow): self.set_controls() self.connect_controls() #self.set_navigation() - - + + def set_controls(self): #pyxbmct.AddonWindow().setImage(__root__ + '/resources/skins/Default/media/ConfluenceDialogBack.png') #self.placeControl(self.background, 0, 0, rowspan=3, columnspan=2) From 0a85148196f0fdecabb5286b25f1914a66b84a39 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Thu, 8 Dec 2016 19:15:42 +0300 Subject: [PATCH 050/126] some fixes --- SkorbaLoader.py | 3 ++- searchwindow.py | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/SkorbaLoader.py b/SkorbaLoader.py index b58d1f5..b8e3cd7 100644 --- a/SkorbaLoader.py +++ b/SkorbaLoader.py @@ -233,8 +233,9 @@ class SkorbaLoader: def getContentList(self): filelist = [] + #from functions import decode_str for contentId, contentFile in enumerate(self.torrentFileInfo.files()): - stringdata = {"title": localize_path(contentFile.path), "size": contentFile.size, "ind": int(contentId), + stringdata = {"title": contentFile.path, "size": contentFile.size, "ind": int(contentId), 'offset': contentFile.offset} filelist.append(stringdata) return filelist diff --git a/searchwindow.py b/searchwindow.py index e9b8159..0c664ea 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -45,6 +45,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): fileList = [] contentList = [] searchersList = [] + addtime = None right_buttons_count = 6 last_right_buttons_count = 0 last_link = None @@ -154,11 +155,15 @@ class SearchWindow(pyxbmct.AddonDialogWindow): query = self.input_search.getText() log('Search query: '+str(query)) + if not addtime and query == self.last_query: + addtime = self.addtime + searchersList = get_searchersList(addtime) #cache if (query != self.last_query or self.searchersList != searchersList) and len(query)>0: self.filesList = get_filesList(query, searchersList, addtime) + self.addtime = addtime self.searchersList = searchersList self.last_query = query elif len(query)==0: From f5dbf2bb7a64e2b84f5c434b212a366ff8fc274f Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Thu, 8 Dec 2016 23:58:03 +0300 Subject: [PATCH 051/126] set right menu label --- addon.xml | 2 +- searchwindow.py | 115 +++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 96 insertions(+), 21 deletions(-) diff --git a/addon.xml b/addon.xml index bdfa829..fa8fcb3 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/searchwindow.py b/searchwindow.py index 0c664ea..5083785 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -18,7 +18,7 @@ along with this program. If not, see . ''' import xbmcaddon -import xbmc +import xbmcvfs import xbmcgui from functions import * import pyxbmct.addonwindow as pyxbmct @@ -53,6 +53,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): last_action = None last_top_button = None last_right_button = None + last_listing_mode = None + count = 0 icon = __root__ + '/icons/searchwindow/%s.png' @@ -98,6 +100,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.connect(self.button_history, self.history) self.connect(self.button_search, self.search) self.connect(self.button_controlcenter, self.controlCenter) + self.connect(self.button_torrentclient, self.browser) self.connect(pyxbmct.ACTION_NAV_BACK, self.close) self.connect(pyxbmct.ACTION_PREVIOUS_MENU, self.close) @@ -105,6 +108,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.connect(ACTION_CONTEXT_MENU, self.context) self.connect(ACTION_SHOW_OSD, self.context) + self.connect(pyxbmct.ACTION_MOVE_LEFT, self.right_menu_set_label) + self.connect(pyxbmct.ACTION_MOVE_RIGHT, self.right_menu_set_label) + self.connect(pyxbmct.ACTION_MOVE_UP, self.right_menu_set_label) + self.connect(pyxbmct.ACTION_MOVE_DOWN, self.right_menu_set_label) + def set_navigation(self): #Top menu self.button_downloadstatus.setNavigation(self.listing, self.listing, self.last_right_button, self.button_torrentclient) @@ -215,13 +223,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def browser(self, params={}): from resources.utorrent.net import Download - self.right_menu('browser') self.listing.reset() menu, dirs = [], [] contextMenustring = 'XBMC.RunPlugin(%s)' % ('%s?action=%s&url=%s') % (sys.argv[0], 'uTorrentBrowser', '%s') get = params.get - action = get('action') hash = get('hash') ind = get('ind') @@ -234,6 +240,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): return if not hash: + self.right_menu('browser') for data in DownloadList: status = " " img='' @@ -242,26 +249,28 @@ class SearchWindow(pyxbmct.AddonDialogWindow): elif data['status'] in ('seeding', 'downloading'): status = TextBB(' [>] ', 'b') if data['status'] == 'seed_pending': - img = os.path.join(self.ROOT, 'icons', 'pause-icon.png') + img = os.path.join(__root__, 'icons', 'pause-icon.png') elif data['status'] == 'stopped': - img = os.path.join(self.ROOT, 'icons', 'stop-icon.png') + img = os.path.join(__root__, 'icons', 'stop-icon.png') elif data['status'] == 'seeding': - img = os.path.join(self.ROOT, 'icons', 'upload-icon.png') + img = os.path.join(__root__, 'icons', 'upload-icon.png') elif data['status'] == 'downloading': - img = os.path.join(self.ROOT, 'icons', 'download-icon.png') + img = os.path.join(__root__, 'icons', 'download-icon.png') + + title = '[%s%%]%s%s [%s]' % (str(data['progress']),status,data['name'],str(data['ratio'])) + #title = '[' + str(data['progress']) + '%]' + status + data['name'] + ' [' + str(data['ratio']) + ']' menu.append( - {"title": '[' + str(data['progress']) + '%]' + status + data['name'] + ' [' + str( - data['ratio']) + ']', "image":img, - "argv": {'hash': str(data['id'])}}) + {"title": title, "image":img, "argv": {'mode':'browser_item', 'hash': str(data['id'])}}) elif not tdir: + self.right_menu('browser_file') dllist = sorted(Download().listfiles(hash), key=lambda x: x[0]) for name, percent, ind, size in dllist: if '/' not in name: - menu.append({"title": '[' + str(percent) + '%]' + '[' + str(size) + '] ' + name, "image":'', - "argv": {'hash': hash, 'ind': str(ind), 'action': 'context'}}) + title = '[%s%%][%s]%s' % (str(percent), str(size), name) + menu.append({"title": title, "image":'', + "argv": {'mode':'browser_file', 'hash': hash, 'ind': str(ind)}}) else: tdir = name.split('/')[0] - # tfile=name[len(tdir)+1:] if tdir not in dirs: dirs.append(tdir) elif tdir: dllist = sorted(Download().listfiles(hash), key=lambda x: x[0]) @@ -272,7 +281,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): "argv": {'hash': hash, 'ind': str(ind), 'action': 'context'}}) for i in dirs: - app = {'hash': hash, 'tdir': i} + app = {'mode':'browser_folder', 'hash': hash, 'tdir': i} link = json.dumps(app) popup = [] folder = True @@ -302,13 +311,14 @@ class SearchWindow(pyxbmct.AddonDialogWindow): app['action'] = a popup.append((self.localize(title), contextMenustring % urllib.quote_plus(json.dumps(app)))) - self.drawItem(i['title'], 'uTorrentBrowser', link, image=img, isFolder=folder) + self.drawItem(i['title'], link, image=img, isFolder=folder) + #def drawItem(self, title, params, image = None, isFolder = False): return def browser_action(self, params={}): from resources.utorrent.net import Download - + menu = [] get = params.get action = get('action') @@ -446,8 +456,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.localize('Play File')] elif mode in ['browser_folder']: label_list = [self.localize('High Priority Files'), - self.localize('Copy Files in Root'), - self.localize('Skip All Files')] + self.localize('Skip All Files'), + self.localize('Copy Files in Root'),] return label_list @@ -505,8 +515,71 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.listing, self.input_search) + self.set_menulist(mode) self.set_navigation() + def right_menu_set_label(self): + debug('start right_menu_set_label'+str(self.getFocus())) + if self.getFocus() == self.listing: + item = self.listing.getSelectedItem() + params = json.loads(item.getfilename()) + mode = params.get('mode') + debug('right_menu_set_label:' + str(mode)) + if self.last_listing_mode != mode: + self.last_listing_mode = mode + debug('set_menulist right_menu_set_label:' + str(mode)) + self.set_menulist(mode) + + def set_menulist(self, mode): + self.count+=1 + label_list = self.get_menulist(mode) + debug('set_menulist; '+str(label_list)) + + right_buttons_count = len(label_list) + button_num_list = range(1, right_buttons_count+1) + debug('set_menulist button_num_list: '+str(button_num_list)) + + for index in button_num_list: + button = getattr(self, "button_right" + str(index)) + self.setlabel(button, (label_list[index - 1])) + button.setEnabled(True) + + debug('set_menulist self.right_buttons_count: ' + str(right_buttons_count)) + debug('set_menulist right_buttons_count: ' + str(right_buttons_count)) + if self.right_buttons_count > right_buttons_count: + disable_button_num_list = range(right_buttons_count + 1, self.right_buttons_count + 1) + debug('set_menulist disable_button_num_list: ' + str(disable_button_num_list)) + for index in disable_button_num_list: + button = getattr(self, "button_right" + str(index)) + button.setLabel(' ') + button.setEnabled(False) + + def setlabel(self, button, label): + label = label.decode('utf-8') + + log(label+' '+str(len(label))) + + if len(label) > 10: + spaces = label.count(' ') + log('spaces=' + str(spaces)) + if spaces == 0: + words = [label[:10], label[10:]] + label = '%s-\r\n%s' % (words[0], words[1]) + elif spaces == 1: + words = label.split(' ') + label = '%s\r\n%s' % (words[0], words[1]) + elif spaces == 2: + words = label.split(' ') + if len(words[0]) <= len(words[2]): + words[0] = words[0] + ' ' + words[1] + words[1] = words[2] + else: + words[1] = words[1] + ' ' + words[2] + label = '%s\r\n%s' % (words[0], words[1]) + + button.setLabel(label) + + def right_press1(self): item = self.listing.getSelectedItem() params = json.loads(item.getfilename()) @@ -530,6 +603,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): addtime = params.get('addtime') self.input_search.setText(filename) self.search(addtime) + elif mode == 'browser_item': + self.browser(params) def right_press2(self): item = self.listing.getSelectedItem() @@ -631,9 +706,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): import controlcenter controlcenter.main() - def reconnect(self, event, callable): + def reconnect(self, event, callabel): self.disconnect(event) - self.connect(event, callable) + self.connect(event, callabel) def version_check(self): return False if int(xbmc.getInfoLabel( "System.BuildVersion" )[:2]) < 17 else True From 25a7d9a3fb00b2f31da4ee403b608f5aea281146 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Fri, 9 Dec 2016 21:11:23 +0300 Subject: [PATCH 052/126] torrent browser --- Core.py | 15 +- Localization.py | 4 + functions.py | 15 +- icons/searchwindow/button.psd | Bin 528676 -> 917812 bytes icons/searchwindow/fdeluge.png | Bin 0 -> 13774 bytes icons/searchwindow/fqbittorrent.png | Bin 0 -> 18928 bytes ...ftorrentclient.png => ftorrent-client.png} | Bin icons/searchwindow/ftransmission.png | Bin 0 -> 19708 bytes icons/searchwindow/fvuze.png | Bin 0 -> 2901 bytes icons/searchwindow/nfdeluge.png | Bin 0 -> 13933 bytes icons/searchwindow/nfqbittorrent.png | Bin 0 -> 19319 bytes ...torrentclient.png => nftorrent-client.png} | Bin icons/searchwindow/nftransmission.png | Bin 0 -> 20278 bytes icons/searchwindow/nfvuze.png | Bin 0 -> 3357 bytes searchwindow.py | 402 ++++++++++-------- 15 files changed, 247 insertions(+), 189 deletions(-) create mode 100644 icons/searchwindow/fdeluge.png create mode 100644 icons/searchwindow/fqbittorrent.png rename icons/searchwindow/{ftorrentclient.png => ftorrent-client.png} (100%) create mode 100644 icons/searchwindow/ftransmission.png create mode 100644 icons/searchwindow/fvuze.png create mode 100644 icons/searchwindow/nfdeluge.png create mode 100644 icons/searchwindow/nfqbittorrent.png rename icons/searchwindow/{nftorrentclient.png => nftorrent-client.png} (100%) create mode 100644 icons/searchwindow/nftransmission.png create mode 100644 icons/searchwindow/nfvuze.png diff --git a/Core.py b/Core.py index fc9f7a0..9f2a6c6 100644 --- a/Core.py +++ b/Core.py @@ -90,7 +90,7 @@ class Core: self.drawItem('< %s >' % self.localize('Download Status'), 'DownloadStatus', image=self.ROOT + '/icons/download.png', contextMenu=DLScontextMenu, replaceMenu=False) self.drawItem('< %s >' % self.localize('Torrent-client Browser'), 'uTorrentBrowser', - image=self.ROOT + '/icons/' + self.getTorrentClientIcon()) + image=self.ROOT + '/icons/' + getTorrentClientIcon()) if self.history_bool: WatchedHistorycontextMenu=[] WatchedHistorycontextMenu.extend(contextMenu) @@ -1940,19 +1940,6 @@ class Core: i=delete_russian(ok=True, action='return') showMessage(self.localize('Return Russian stuff'),self.localize('%d files have been returned')%i) - def getTorrentClientIcon(self): - client = self.__settings__.getSetting("torrent") - if client == '1': - return 'transmission.png' - elif client == '2': - return 'vuze.png' - elif client == '3': - return 'deluge.png' - elif client == '4': - return 'qbittorrent.png' - else: - return 'torrent-client.png' - def callback(self, params={}): get = params.get diff --git a/Localization.py b/Localization.py index aea63f0..f0fb88d 100644 --- a/Localization.py +++ b/Localization.py @@ -809,6 +809,9 @@ def localize(text): 'Play (from start)':'Lejátszás (az elejétől)', }, 'ru': { + 'Info':'Инфо', + 'Delete torrent with files?':'Вы уверены, что хотите удалить торрент с файлами?', + 'Fav. / Unfav.':'Доб./удал. Избранное', 'Search Window': 'Окно поиска', 'Context menu': 'Контекстное меню', 'Seeds searching.': 'Идёт поиск сидов.', @@ -1011,6 +1014,7 @@ def localize(text): 'Stop All':'Остановить Все', 'Keyboard':'Клавиатура', 'Copy Files in Root':'Скопировать файлы в Корень', + 'Copy in Root': 'Скопировать в Корень', 'Copied %d files!':'Скопировано %d файлов!', 'Return to %s':'Вернуться в %s', 'Search results:':'Результаты поиска:', diff --git a/functions.py b/functions.py index b2167ac..f48a290 100644 --- a/functions.py +++ b/functions.py @@ -2189,4 +2189,17 @@ def get_platform(): ret["os"] = "ios" ret["arch"] = "arm" - return ret \ No newline at end of file + return ret + +def getTorrentClientIcon(): + client = __settings__.getSetting("torrent") + if client == '1': + return 'transmission.png' + elif client == '2': + return 'vuze.png' + elif client == '3': + return 'deluge.png' + elif client == '4': + return 'qbittorrent.png' + else: + return 'torrent-client.png' \ No newline at end of file diff --git a/icons/searchwindow/button.psd b/icons/searchwindow/button.psd index 1d49059acd819b3411332df1040c0312eb199c52..feaf4c6f48a1d687267490cb68707184cd2124f2 100644 GIT binary patch delta 409023 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�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\hzCq)<{q=gvP>QbqxxE*;We0NJu9 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

?v7#^m95kWD3%rp>z~h9SQgd-7rbfkB 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

w#BsG6l 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 delta 24661 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 VIsT}0zuySJNn@+yPYlWN{{t2f$s7Ox literal 0 HcmV?d00001 diff --git a/icons/searchwindow/fqbittorrent.png b/icons/searchwindow/fqbittorrent.png new file mode 100644 index 0000000000000000000000000000000000000000..c8dd9e14ea21dba3f02099fde4e497d82fcd6e9a GIT binary patch literal 18928 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 literal 0 HcmV?d00001 diff --git a/icons/searchwindow/ftorrentclient.png b/icons/searchwindow/ftorrent-client.png similarity index 100% rename from icons/searchwindow/ftorrentclient.png rename to icons/searchwindow/ftorrent-client.png diff --git a/icons/searchwindow/ftransmission.png b/icons/searchwindow/ftransmission.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc7721f67b291c9752637c42920154c06370764 GIT binary patch literal 19708 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 literal 0 HcmV?d00001 diff --git a/icons/searchwindow/fvuze.png b/icons/searchwindow/fvuze.png new file mode 100644 index 0000000000000000000000000000000000000000..9762c0a70d12b427bbeff20b54ec03558ffbba0f GIT binary patch literal 2901 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 literal 0 HcmV?d00001 diff --git a/icons/searchwindow/nfdeluge.png b/icons/searchwindow/nfdeluge.png new file mode 100644 index 0000000000000000000000000000000000000000..4e21b9a5be13e8fae9be7e06f9b7111bb19f9117 GIT binary patch literal 13933 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 literal 0 HcmV?d00001 diff --git a/icons/searchwindow/nfqbittorrent.png b/icons/searchwindow/nfqbittorrent.png new file mode 100644 index 0000000000000000000000000000000000000000..e316251827ba4aa2ca030bd6fca5ded127ffed05 GIT binary patch literal 19319 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 literal 0 HcmV?d00001 diff --git a/icons/searchwindow/nfvuze.png b/icons/searchwindow/nfvuze.png new file mode 100644 index 0000000000000000000000000000000000000000..8afc5042641d9a1b2bbd2d2669b2ef86ac89438e GIT binary patch literal 3357 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 IdJf_L2h7medjJ3c literal 0 HcmV?d00001 diff --git a/searchwindow.py b/searchwindow.py index 5083785..d31edca 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -17,13 +17,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . ''' -import xbmcaddon -import xbmcvfs -import xbmcgui -from functions import * import pyxbmct.addonwindow as pyxbmct -import Localization -import re +import xbmcaddon +import xbmcgui +import xbmcvfs + +from functions import * __settings__ = xbmcaddon.Addon(id='plugin.video.torrenter') __language__ = __settings__.getLocalizedString @@ -33,13 +32,14 @@ __root__ = __settings__.getAddonInfo('path') log('SYS ARGV: ' + str(sys.argv)) -#https://github.com/xbmc/xbmc/blob/8d4a5bba55638dfd0bdc5e7de34f3e5293f99933/xbmc/input/Key.h +# https://github.com/xbmc/xbmc/blob/8d4a5bba55638dfd0bdc5e7de34f3e5293f99933/xbmc/input/Key.h ACTION_STOP = 13 ACTION_PLAYER_PLAY = 79 ACTION_MOUSE_RIGHT_CLICK = 101 ACTION_CONTEXT_MENU = 117 ACTION_SHOW_OSD = 24 + class SearchWindow(pyxbmct.AddonDialogWindow): __settings__ = sys.modules["__main__"].__settings__ fileList = [] @@ -57,6 +57,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): count = 0 icon = __root__ + '/icons/searchwindow/%s.png' + icon_tc = __root__ + '/icons/searchwindow/%s' + getTorrentClientIcon() def __init__(self, title="", s_param={}): super(SearchWindow, self).__init__(title) @@ -69,30 +70,40 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.history() def set_controls(self): - self.background.setImage('%s/icons/%s.png' %(__root__, 'ContentPanel')) + if not __settings__.getSetting('debug') == 'true': + self.background.setImage('%s/icons/%s.png' % (__root__, 'ContentPanel')) - #Top menu - self.button_downloadstatus = pyxbmct.Button("OFF", textColor = '0xFF0000FF', focusTexture = self.icon % 'fdownloadstatus', noFocusTexture = self.icon % 'nfdownloadstatus') + # Top menu + self.button_downloadstatus = pyxbmct.Button("OFF", textColor='0xFF0000FF', + focusTexture=self.icon % 'fdownloadstatus', + noFocusTexture=self.icon % 'nfdownloadstatus') self.placeControl(self.button_downloadstatus, 0, 2, 1, 1) - self.button_torrentclient = pyxbmct.Button("OFF", textColor = '0xFF0000FF', focusTexture = self.icon % 'ftorrentclient', noFocusTexture = self.icon % 'nftorrentclient') + + self.button_torrentclient = pyxbmct.Button("", + focusTexture=self.icon_tc % 'f', + noFocusTexture=self.icon_tc % 'nf') self.placeControl(self.button_torrentclient, 0, 3, 1, 1) - self.button_keyboard = pyxbmct.Button("", focusTexture = self.icon % 'fkeyboard', noFocusTexture = self.icon % 'nfkeyboard') + self.button_keyboard = pyxbmct.Button("", focusTexture=self.icon % 'fkeyboard', + noFocusTexture=self.icon % 'nfkeyboard') self.placeControl(self.button_keyboard, 0, 4, 1, 1) self.input_search = pyxbmct.Edit("", _alignment=pyxbmct.ALIGN_CENTER_X | pyxbmct.ALIGN_CENTER_Y) self.placeControl(self.input_search, 0, 5, 1, 5) - self.button_search = pyxbmct.Button("", focusTexture = self.icon % 'fsearch', noFocusTexture = self.icon % 'nfsearch') + self.button_search = pyxbmct.Button("", focusTexture=self.icon % 'fsearch', + noFocusTexture=self.icon % 'nfsearch') self.placeControl(self.button_search, 0, 10, 1, 1) - self.button_history = pyxbmct.Button("", focusTexture = self.icon % 'fhistory', noFocusTexture = self.icon % 'nfhistory') + self.button_history = pyxbmct.Button("", focusTexture=self.icon % 'fhistory', + noFocusTexture=self.icon % 'nfhistory') self.placeControl(self.button_history, 0, 11, 1, 1) - self.button_controlcenter = pyxbmct.Button("", focusTexture = self.icon % 'fcontrolcenter', noFocusTexture = self.icon % 'nfcontrolcenter') + self.button_controlcenter = pyxbmct.Button("", focusTexture=self.icon % 'fcontrolcenter', + noFocusTexture=self.icon % 'nfcontrolcenter') self.placeControl(self.button_controlcenter, 0, 12, 1, 1) - #Main + # Main self.listing = pyxbmct.List(_imageWidth=60, _imageHeight=60, _itemTextXOffset=1, _itemTextYOffset=0, _itemHeight=60, _space=0, _alignmentY=4) self.placeControl(self.listing, 1, 0, 8, 14) - #Right menu + # Right menu self.right_menu() def connect_controls(self): @@ -114,17 +125,20 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.connect(pyxbmct.ACTION_MOVE_DOWN, self.right_menu_set_label) def set_navigation(self): - #Top menu - self.button_downloadstatus.setNavigation(self.listing, self.listing, self.last_right_button, self.button_torrentclient) - self.button_torrentclient.setNavigation(self.listing, self.listing, self.button_downloadstatus, self.button_keyboard) + # Top menu + self.button_downloadstatus.setNavigation(self.listing, self.listing, self.last_right_button, + self.button_torrentclient) + self.button_torrentclient.setNavigation(self.listing, self.listing, self.button_downloadstatus, + self.button_keyboard) self.button_keyboard.setNavigation(self.listing, self.listing, self.button_torrentclient, self.input_search) self.input_search.setNavigation(self.listing, self.listing, self.button_keyboard, self.button_search) self.button_search.setNavigation(self.listing, self.listing, self.input_search, self.button_history) self.button_history.setNavigation(self.listing, self.listing, self.button_search, self.button_controlcenter) self.button_controlcenter.setNavigation(self.listing, self.listing, self.button_history, self.last_right_button) - #Main - self.listing.setNavigation(self.input_search, self.input_search, self.button_downloadstatus, self.last_right_button) + # Main + self.listing.setNavigation(self.input_search, self.input_search, self.button_downloadstatus, + self.last_right_button) if self.listing.size(): self.setFocus(self.listing) @@ -155,32 +169,32 @@ class SearchWindow(pyxbmct.AddonDialogWindow): else: self.input_search.setText(search) query = search - #self.setFocus(self.listing) + # self.setFocus(self.listing) else: query = self.input_search.getText() self.history() else: query = self.input_search.getText() - log('Search query: '+str(query)) + log('Search query: ' + str(query)) if not addtime and query == self.last_query: addtime = self.addtime searchersList = get_searchersList(addtime) - #cache - if (query != self.last_query or self.searchersList != searchersList) and len(query)>0: + # cache + if (query != self.last_query or self.searchersList != searchersList) and len(query) > 0: self.filesList = get_filesList(query, searchersList, addtime) self.addtime = addtime self.searchersList = searchersList self.last_query = query - elif len(query)==0: + elif len(query) == 0: self.filesList = [] - if 1==1: + if 1 == 1: if self.filesList: for (order, seeds, leechers, size, title, link, image) in self.filesList: title = titleMake(seeds, leechers, size, title) - self.drawItem(title, {'mode':'search_item', 'filename': link}, image) + self.drawItem(title, {'mode': 'search_item', 'filename': link}, image) self.setFocus(self.listing) def history(self): @@ -202,7 +216,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): else: img = __root__ + '/icons/unfav.png' - link = {'mode': 'history_search_item', 'filename': title, 'addtime': str(addtime), 'fav':str(fav)} + link = {'mode': 'history_search_item', 'filename': title, 'addtime': str(addtime), + 'fav': str(fav)} self.drawItem(bbstring % title, link, img) def history_action(self, action, addtime, fav): @@ -221,19 +236,12 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.history() - def browser(self, params={}): + def browser(self, hash = None, tdir = None): from resources.utorrent.net import Download self.listing.reset() menu, dirs = [], [] contextMenustring = 'XBMC.RunPlugin(%s)' % ('%s?action=%s&url=%s') % (sys.argv[0], 'uTorrentBrowser', '%s') - get = params.get - action = get('action') - hash = get('hash') - ind = get('ind') - tdir = get('tdir') - - DownloadList = Download().list() if DownloadList == False: showMessage(self.localize('Error'), self.localize('No connection! Check settings!'), forced=True) @@ -241,14 +249,15 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if not hash: self.right_menu('browser') + self.reconnect(pyxbmct.ACTION_NAV_BACK, self.history) for data in DownloadList: status = " " - img='' + img = '' if data['status'] in ('seed_pending', 'stopped'): status = TextBB(' [||] ', 'b') elif data['status'] in ('seeding', 'downloading'): status = TextBB(' [>] ', 'b') - if data['status'] == 'seed_pending': + if data['status'] == 'seed_pending': img = os.path.join(__root__, 'icons', 'pause-icon.png') elif data['status'] == 'stopped': img = os.path.join(__root__, 'icons', 'stop-icon.png') @@ -257,74 +266,65 @@ class SearchWindow(pyxbmct.AddonDialogWindow): elif data['status'] == 'downloading': img = os.path.join(__root__, 'icons', 'download-icon.png') - title = '[%s%%]%s%s [%s]' % (str(data['progress']),status,data['name'],str(data['ratio'])) - #title = '[' + str(data['progress']) + '%]' + status + data['name'] + ' [' + str(data['ratio']) + ']' + title = '[%s%%]%s%s [%s]' % (str(data['progress']), status, data['name'], str(data['ratio'])) + # title = '[' + str(data['progress']) + '%]' + status + data['name'] + ' [' + str(data['ratio']) + ']' menu.append( - {"title": title, "image":img, "argv": {'mode':'browser_item', 'hash': str(data['id'])}}) + {"title": title, "image": img, "argv": {'mode': 'browser_item', 'hash': str(data['id'])}}) elif not tdir: - self.right_menu('browser_file') + self.right_menu('browser_subfolder') + self.reconnect(pyxbmct.ACTION_NAV_BACK, self.browser) + self.drawItem('..', {'mode': 'browser_moveup'}, isFolder=True) dllist = sorted(Download().listfiles(hash), key=lambda x: x[0]) for name, percent, ind, size in dllist: if '/' not in name: title = '[%s%%][%s]%s' % (str(percent), str(size), name) - menu.append({"title": title, "image":'', - "argv": {'mode':'browser_file', 'hash': hash, 'ind': str(ind)}}) + menu.append({"title": title, "image": '', + "argv": {'mode': 'browser_file', 'hash': hash, 'ind': str(ind)}}) else: - tdir = name.split('/')[0] - if tdir not in dirs: dirs.append(tdir) + newtdir = name.split('/')[0] + if newtdir not in dirs: dirs.append(newtdir) elif tdir: + self.right_menu('browser_subfolder') + tdir_up = tdir[:len(tdir)-len(tdir.split('/')[-1])-1] if '/' in tdir else None + self.drawItem('..', {'mode': 'browser_subfolder', 'hash': hash, 'tdir': tdir_up}, isFolder=True) dllist = sorted(Download().listfiles(hash), key=lambda x: x[0]) for name, percent, ind, size in dllist: - if '/' in name and tdir in name: - menu.append( - {"title": '[' + str(percent) + '%]' + '[' + str(size) + '] ' + name[len(tdir) + 1:], "image":'', - "argv": {'hash': hash, 'ind': str(ind), 'action': 'context'}}) - for i in dirs: - app = {'mode':'browser_folder', 'hash': hash, 'tdir': i} - link = json.dumps(app) - popup = [] - folder = True - actions = [('3', self.localize('High Priority Files')), ('copy', self.localize('Copy Files in Root')), ('0', self.localize('Skip All Files'))] - for a, title in actions: - app['action'] = a - popup.append((self.localize(title), contextMenustring % urllib.quote_plus(json.dumps(app)))) - self.drawItem(i, 'uTorrentBrowser', link, isFolder=folder) + if name[:len(tdir)] == tdir: + name = name[len(tdir) + 1:] + if '/' not in name: + title = '[%s%%][%s]%s' % (str(percent), str(size), name) + menu.append({"title": title, "image": '', + "argv": {'mode': 'browser_file', 'hash': hash, 'ind': str(ind)}}) + else: + newtdir = tdir+'/'+name.split('/')[0] + if newtdir not in dirs: dirs.append(newtdir) + + for tdir in dirs: + params = {'mode': 'browser_subfolder', 'hash': hash, 'tdir': tdir} + title = tdir.split('/')[-1] if '/' in tdir else tdir + self.drawItem(title, params, isFolder = True) for i in menu: - app = i['argv'] - link = json.dumps(app) + params = i['argv'] img = i['image'] popup = [] if not hash: - actions = [('start', self.localize('Start')), ('stop', self.localize('Stop')), - ('remove', self.localize('Remove')), - ('3', self.localize('High Priority Files')), ('0', self.localize('Skip All Files')), - ('removedata', self.localize('Remove with files'))] - folder = True else: - actions = [('3', self.localize('High Priority')), ('0', self.localize('Skip File')), - ('play', self.localize('Play File'))] folder = False - for a, title in actions: - app['action'] = a - popup.append((self.localize(title), contextMenustring % urllib.quote_plus(json.dumps(app)))) - - self.drawItem(i['title'], link, image=img, isFolder=folder) - #def drawItem(self, title, params, image = None, isFolder = False): + self.drawItem(i['title'], params, image = img, isFolder = folder) + # def drawItem(self, title, params, image = None, isFolder = False): + if self.listing.size(): + self.setFocus(self.listing) + else: + self.setFocus(self.button_torrentclient) return - def browser_action(self, params={}): + def browser_action(self, hash, action, tdir = None, ind = None): from resources.utorrent.net import Download menu = [] - get = params.get - - action = get('action') - hash = get('hash') - ind = get('ind') - tdir = get('tdir') DownloadList = Download().list() if DownloadList == False: @@ -333,27 +333,27 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if (ind or ind == 0) and action in ('0', '3'): Download().setprio_simple(hash, action, ind) - elif action in ['play','copy']: + elif action in ['play', 'copy']: p, dllist, i, folder, filename = DownloadList, Download().listfiles(hash), 0, None, None for data in p: if data['id'] == hash: folder = data['dir'] break if isRemoteTorr(): - t_dir = self.__settings__.getSetting("torrent_dir") + torrent_dir = self.__settings__.getSetting("torrent_dir") torrent_replacement = self.__settings__.getSetting("torrent_replacement") empty = [None, ''] - if t_dir in empty or torrent_replacement in empty: + if torrent_dir in empty or torrent_replacement in empty: if xbmcgui.Dialog().yesno( self.localize('Remote Torrent-client'), self.localize('You didn\'t set up replacement path in setting.'), self.localize('For example /media/dl_torr/ to smb://SERVER/dl_torr/. Setup now?')): - if t_dir in empty: + if torrent_dir in empty: torrent_dir() self.__settings__.openSettings() return - folder = folder.replace(t_dir, torrent_replacement) + folder = folder.replace(torrent_dir, torrent_replacement) if (ind or ind == 0) and action == 'play': for data in dllist: if data[2] == int(ind): @@ -362,28 +362,32 @@ class SearchWindow(pyxbmct.AddonDialogWindow): filename = os.path.join(folder, filename) xbmc.executebuiltin('xbmc.PlayMedia("' + filename.encode('utf-8') + '")') elif tdir and action == 'copy': - path=os.path.join(folder, tdir) - dirs, files=xbmcvfs.listdir(path) + path = os.path.join(folder, tdir) + dirs, files = xbmcvfs.listdir(path) if len(dirs) > 0: dirs.insert(0, self.localize('./ (Root folder)')) for dd in dirs: dd = file_decode(dd) - dds=xbmcvfs.listdir(os.path.join(path,dd))[0] - if len(dds)>0: + dds = xbmcvfs.listdir(os.path.join(path, dd))[0] + if len(dds) > 0: for d in dds: - dirs.append(dd+os.sep+d) + dirs.append(dd + os.sep + d) ret = xbmcgui.Dialog().select(self.localize('Choose directory:'), dirs) if ret > 0: - path=os.path.join(path, dirs[ret]) - dirs, files=xbmcvfs.listdir(path) + path = os.path.join(path, dirs[ret]) + dirs, files = xbmcvfs.listdir(path) for file in files: - if not xbmcvfs.exists(os.path.join(path,file)): - xbmcvfs.delete(os.path.join(path,file)) - xbmcvfs.copy(os.path.join(path,file),os.path.join(folder,file)) - i=i+1 + if not xbmcvfs.exists(os.path.join(path, file)): + xbmcvfs.delete(os.path.join(path, file)) + xbmcvfs.copy(os.path.join(path, file), os.path.join(folder, file)) + i = i + 1 showMessage(self.localize('Torrent-client Browser'), self.localize('Copied %d files!') % i, forced=True) return elif not tdir and action not in ('0', '3'): + if action == 'removedata': + ok = xbmcgui.Dialog().yesno(self.localize('Torrent-client Browser'), + self.localize('Delete torrent with files?')) + if not ok: sys.exit(1) Download().action_simple(action, hash) elif action in ('0', '3'): dllist = sorted(Download().listfiles(hash), key=lambda x: x[0]) @@ -395,11 +399,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): menu.append((hash, action, str(ind))) Download().setprio_simple_multi(menu) return - xbmc.executebuiltin('Container.Refresh') return - def open_torrent(self, link, tdir = None): - #cache + def open_torrent(self, link, tdir=None): + # cache if link != self.last_link: self.contentList = get_contentList(link) self.last_link = link @@ -408,19 +411,19 @@ class SearchWindow(pyxbmct.AddonDialogWindow): dirList, contentListNew = cutFolder(self.contentList, tdir) if not tdir: - self.drawItem('..', {'mode': 'torrent_moveup', 'filename': link}, isFolder=True) + params = {'mode': 'torrent_moveup', 'filename': link} else: params = {'mode': 'torrent_subfolder', 'filename': link} - self.drawItem('..', params, isFolder=True) + self.drawItem('..', params, isFolder=True) dirList = sorted(dirList, key=lambda x: x[0], reverse=False) for title in dirList: - self.drawItem(title, {'mode':'torrent_subfolder', 'tdir': title, 'filename': link}, isFolder=True) + self.drawItem(title, {'mode': 'torrent_subfolder', 'tdir': title, 'filename': link}, isFolder=True) ids_video_result = get_ids_video(contentListNew) - ids_video='' + ids_video = '' - if len(ids_video_result)>0: + if len(ids_video_result) > 0: for identifier in ids_video_result: ids_video = ids_video + str(identifier) + ',' @@ -431,33 +434,35 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def get_menulist(self, mode): - label_list = ["Empty","Empty","Empty","Empty","Empty","Empty"] + label_list = ["Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty"] if mode in ['search', 'search_item', 'torrent_play']: - label_list = ["Open", + label_list = [self.localize('Open'), self.localize('Download via T-client'), self.localize('Download via Libtorrent'), - 'Info'] - elif mode in ['torrent_subfolder', 'torrent_moveup']: - label_list = ["Open"] + self.localize('Info'),] + elif mode in ['torrent_subfolder', 'torrent_moveup', + 'browser_moveup']: + label_list = [self.localize('Open'),] elif mode in ['history', 'history_search_item']: label_list = [self.localize('Open'), self.localize('Edit'), self.localize('Individual Tracker Options'), - 'Fav/Unfav', + self.localize('Fav. / Unfav.'), self.localize('Delete')] elif mode in ['browser', 'browser_item']: - label_list = [self.localize('Start'), self.localize('Stop'), - self.localize('Remove'), self.localize('High Priority Files'), + label_list = [self.localize('Open'), self.localize('Start'), self.localize('Stop'), + self.localize('Remove'), self.localize('High Priority'), self.localize('Skip All Files'), self.localize('Remove with files')] elif mode in ['browser_file']: - label_list = [self.localize('High Priority'), self.localize('Skip File'), - self.localize('Play File')] - elif mode in ['browser_folder']: - label_list = [self.localize('High Priority Files'), + label_list = [self.localize('Play File'), + self.localize('High Priority'), self.localize('Skip File')] + elif mode in ['browser_subfolder']: + label_list = [self.localize('Open'), + self.localize('High Priority'), self.localize('Skip All Files'), - self.localize('Copy Files in Root'),] + self.localize('Copy in Root'), ] return label_list @@ -481,34 +486,37 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if not mode == 'place': self.last_right_buttons_count = self.right_buttons_count remove_list = [getattr(self, "button_right" + str(index)) for index - in range(1, self.last_right_buttons_count+1)] + in range(1, self.last_right_buttons_count + 1)] self.disconnectEventList(remove_list) self.removeControls(remove_list) label_list = self.get_menulist(mode) self.right_buttons_count = len(label_list) - button_num_list = range(1, self.right_buttons_count+1) + button_num_list = range(1, self.right_buttons_count + 1) for index in button_num_list: setattr(self, "button_right" + str(index), pyxbmct.Button(label_list[index - 1])) button = getattr(self, "button_right" + str(index)) - self.connect(button, getattr(self, "right_press"+str(index))) + self.connect(button, getattr(self, "right_press" + str(index))) self.placeControl(button, index, 14, 1, 2) - #Navigation + # Navigation self.last_right_button = self.button_right1 for index in button_num_list: button = getattr(self, "button_right" + str(index)) if self.right_buttons_count == 1: - button.setNavigation(self.button_controlcenter, self.button_right1, self.listing, self.input_search) + button.setNavigation(self.button_controlcenter, + self.button_right1, self.listing, self.input_search) else: if index == button_num_list[0]: - button.setNavigation(self.button_controlcenter, self.button_right2, self.listing, self.input_search) + button.setNavigation(getattr(self, "button_right" + str(self.right_buttons_count)), + self.button_right2, self.listing, self.input_search) elif index == button_num_list[-1]: - button.setNavigation(getattr(self, "button_right" + str(index-1)), self.button_right1, self.listing, - self.input_search) + button.setNavigation(getattr(self, "button_right" + str(index - 1)), self.button_right1, + self.listing, + self.input_search) else: button.setNavigation(getattr(self, "button_right" + str(index - 1)), getattr(self, "button_right" + str(index + 1)), @@ -519,7 +527,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.set_navigation() def right_menu_set_label(self): - debug('start right_menu_set_label'+str(self.getFocus())) + debug('start right_menu_set_label' + str(self.getFocus())) if self.getFocus() == self.listing: item = self.listing.getSelectedItem() params = json.loads(item.getfilename()) @@ -531,13 +539,13 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.set_menulist(mode) def set_menulist(self, mode): - self.count+=1 + self.count += 1 label_list = self.get_menulist(mode) - debug('set_menulist; '+str(label_list)) + debug('set_menulist; ' + str(label_list)) right_buttons_count = len(label_list) - button_num_list = range(1, right_buttons_count+1) - debug('set_menulist button_num_list: '+str(button_num_list)) + button_num_list = range(1, right_buttons_count + 1) + debug('set_menulist button_num_list: ' + str(button_num_list)) for index in button_num_list: button = getattr(self, "button_right" + str(index)) @@ -557,11 +565,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def setlabel(self, button, label): label = label.decode('utf-8') - log(label+' '+str(len(label))) + debug('setlabel: ' + label + ' ' + str(len(label))) if len(label) > 10: spaces = label.count(' ') - log('spaces=' + str(spaces)) + debug('setlabel spaces=' + str(spaces)) if spaces == 0: words = [label[:10], label[10:]] label = '%s-\r\n%s' % (words[0], words[1]) @@ -579,38 +587,45 @@ class SearchWindow(pyxbmct.AddonDialogWindow): button.setLabel(label) - def right_press1(self): item = self.listing.getSelectedItem() params = json.loads(item.getfilename()) + log('params ' + str(params)) mode = params.get('mode') filename = params.get('filename') + hash = params.get('hash') + ind = params.get('ind') tdir = params.get('tdir') self.listing.reset() - if mode == 'search_item': - self.open_torrent(filename) - elif mode == 'torrent_subfolder': + if mode in ['search_item', 'torrent_subfolder']: self.open_torrent(filename, tdir) elif mode == 'torrent_moveup': self.search() self.setFocus(self.listing) elif mode == 'torrent_play': - action = 'playTorrent' - url = self.form_link(action, params) + url = self.form_link('playTorrent', params) xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) self.close() elif mode == 'history_search_item': addtime = params.get('addtime') self.input_search.setText(filename) self.search(addtime) - elif mode == 'browser_item': - self.browser(params) + elif mode in ['browser_item', 'browser_subfolder']: + self.browser(hash, tdir) + elif mode == 'browser_moveup': + self.browser(hash, tdir) + elif mode == 'browser_file': + self.browser_action(hash, 'play', tdir = tdir, ind = ind) + self.close() def right_press2(self): item = self.listing.getSelectedItem() params = json.loads(item.getfilename()) mode = params.get('mode') filename = params.get('filename') + hash = params.get('hash') + ind = params.get('ind') + tdir = params.get('tdir') if mode == 'torrent_play': action = 'downloadFilesList' link = {'ind': str(params.get('url'))} @@ -624,12 +639,21 @@ class SearchWindow(pyxbmct.AddonDialogWindow): elif mode == 'history_search_item': self.input_search.setText(filename) self.setFocus(self.input_search) + elif mode == 'browser_item': + self.browser_action(hash, 'start') + elif mode == 'browser_subfolder': + self.browser_action(hash, '3', tdir=tdir, ind=ind) + elif mode == 'browser_file': + self.browser_action(hash, '3', tdir=tdir, ind=ind) def right_press3(self): item = self.listing.getSelectedItem() params = json.loads(item.getfilename()) mode = params.get('mode') filename = params.get('filename') + hash = params.get('hash') + ind = params.get('ind') + tdir = params.get('tdir') if mode == 'torrent_play': action = 'downloadLibtorrent' link = {'ind': str(params.get('url'))} @@ -643,35 +667,68 @@ class SearchWindow(pyxbmct.AddonDialogWindow): elif mode == 'history_search_item': params['title'] = params.get('filename') self.controlCenter(params) + elif mode == 'browser_item': + self.browser_action(hash, 'stop') + elif mode == 'browser_subfolder': + self.browser_action(hash, '0', tdir=tdir, ind=ind) + elif mode == 'browser_file': + self.browser_action(hash, '0', tdir=tdir, ind=ind) def right_press4(self): item = self.listing.getSelectedItem() params = json.loads(item.getfilename()) mode = params.get('mode') filename = params.get('filename') + hash = params.get('hash') + ind = params.get('ind') + tdir = params.get('tdir') if mode == 'history_search_item': addtime = params.get('addtime') fav = params.get('fav') self.history_action('fav', addtime, fav) - else: + elif mode == 'search_item': cleanlabel = re.sub('\[[^\]]*\]', '', item.getLabel()) ttl, yr = xbmc.getCleanMovieTitle(cleanlabel) infoW = InfoWindow(ttl, yr) infoW.doModal() del infoW + elif mode == 'browser_item': + self.browser_action(hash, 'remove') + self.browser() + elif mode == 'browser_subfolder': + self.browser_action(hash, 'copy', tdir=tdir, ind=ind) def right_press5(self): item = self.listing.getSelectedItem() params = json.loads(item.getfilename()) mode = params.get('mode') filename = params.get('filename') + hash = params.get('hash') if mode == 'history_search_item': addtime = params.get('addtime') fav = params.get('fav') self.history_action('delete', addtime, fav) + elif mode == 'browser_item': + self.browser_action(hash, '3') def right_press6(self): - pass + item = self.listing.getSelectedItem() + params = json.loads(item.getfilename()) + mode = params.get('mode') + filename = params.get('filename') + hash = params.get('hash') + if mode == 'browser_item': + self.browser_action(hash, '0') + + def right_press7(self): + item = self.listing.getSelectedItem() + params = json.loads(item.getfilename()) + mode = params.get('mode') + filename = params.get('filename') + hash = params.get('hash') + if mode == 'browser_item': + self.browser_action(hash, 'removedata') + self.browser() def localize(self, string): try: @@ -679,7 +736,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): except: return string - def drawItem(self, title, params, image = None, isFolder = False): + def drawItem(self, title, params, image=None, isFolder=False): if isinstance(params, str): params = {'mode': params} @@ -706,20 +763,18 @@ class SearchWindow(pyxbmct.AddonDialogWindow): import controlcenter controlcenter.main() - def reconnect(self, event, callabel): + def reconnect(self, event, callable): self.disconnect(event) - self.connect(event, callabel) + self.connect(event, callable) def version_check(self): - return False if int(xbmc.getInfoLabel( "System.BuildVersion" )[:2]) < 17 else True + return False if int(xbmc.getInfoLabel("System.BuildVersion")[:2]) < 17 else True def onFocus(self): log(str(self.getFocusId())) class InfoWindow(pyxbmct.AddonDialogWindow): - - def __init__(self, title="", year=""): super(InfoWindow, self).__init__(title) self.title = title @@ -727,12 +782,11 @@ class InfoWindow(pyxbmct.AddonDialogWindow): self.setGeometry(600, 600, 3, 3) self.set_controls() self.connect_controls() - #self.set_navigation() - + # self.set_navigation() def set_controls(self): - #pyxbmct.AddonWindow().setImage(__root__ + '/resources/skins/Default/media/ConfluenceDialogBack.png') - #self.placeControl(self.background, 0, 0, rowspan=3, columnspan=2) + # pyxbmct.AddonWindow().setImage(__root__ + '/resources/skins/Default/media/ConfluenceDialogBack.png') + # self.placeControl(self.background, 0, 0, rowspan=3, columnspan=2) self.listing = pyxbmct.List(_imageWidth=30, _imageHeight=30, _itemTextXOffset=1, _itemTextYOffset=0, _itemHeight=30, _space=0, _alignmentY=0) self.placeControl(self.listing, 0, 1, 2, 2) @@ -741,42 +795,42 @@ class InfoWindow(pyxbmct.AddonDialogWindow): self.plot = pyxbmct.TextBox() self.placeControl(self.plot, 2, 0, 1, columnspan=3) self.plot.autoScroll(1000, 1000, 1000) - #self.button_search = pyxbmct.Button("Search") - #self.placeControl(self.button_search, 0, 5, 1, 2) - + # self.button_search = pyxbmct.Button("Search") + # self.placeControl(self.button_search, 0, 5, 1, 2) def connect_controls(self): from resources.scrapers.scrapers import Scrapers self.Scraper = Scrapers() meta = self.Scraper.scraper('tmdb', {'label': 'tmdb', 'search': self.title, 'year': ''}, 'en') meta = meta.get('info') - + """ meta results for xXx {'info': {'count': 7451, 'plot': u'Xander Cage is your standard adrenaline junkie with no fear and a lousy attitude. When the US Government "recruits" him to go on a mission, he\'s not exactly thrilled. His mission: to gather information on an organization that may just be planning the destruction of the world, led by the nihilistic Yorgi.', 'votes': u'809', 'code': u'tt0295701', 'rating': 5.7000000000000002, 'title': u'xXx', 'tagline': u'A New Breed Of Secret Agent.', 'director': u'Rob Cohen', 'premiered': u'2002-08-09', 'originaltitle': u'xXx', 'cast': [u'Vin Diesel', u'Asia Argento', u'Marton Csokas', u'Samuel L. Jackson', u'Michael Roof', u'Petr J\xe1kl Jr.', u'Richy M\xfcller', u'Joe Bucaro III', u'Eve', u'Leila Arcieri', u'William Hope', u'Ted Maynard', u'Martin Hub'], 'castandrole': [u'Vin Diesel|Xander Cage', u'Asia Argento|Yelena', u'Marton Csokas|Yorgi', u'Samuel L. Jackson|Agent Gibbons', u'Michael Roof|Agent Toby Lee Shavers', u'Petr J\xe1kl Jr.|Kolya', u'Richy M\xfcller|Milan Sova', u'Joe Bucaro III|Virg', u'Eve|J.J.', u'Leila Arcieri|Jordan King', u'William Hope|Agent Roger Donnan', u'Ted Maynard|James Tannick', u'Martin Hub|Ivan Podrov'], 'studio': u'Columbia Pictures, Original Film, Revolution Studios', 'year': 2002, 'genre': u'Action', 'runtime': u'124'}, 'thumbnail': u'http://image.tmdb.org/t/p/original/fPHNTG1OXFBQ6aEVO7Lv8tSgfrY.jpg', 'label': 'tmdb', 'properties': {'fanart_image': u'http://image.tmdb.org/t/p/original/oNQIcuvJssiK93TjrXVtbERaKE1.jpg'}, 'icon': u'http://image.tmdb.org/t/p/original/fPHNTG1OXFBQ6aEVO7Lv8tSgfrY.jpg'} """ self.connect(pyxbmct.ACTION_NAV_BACK, self.close) self.connect(pyxbmct.ACTION_PREVIOUS_MENU, self.close) - self.listing.addItem ("Title: %s" % meta.get('title')) - self.listing.addItem ("genre: %s" % meta.get('genre')) - self.listing.addItem ("rating: %s" % meta.get('rating')) - self.listing.addItem ("year: %s" % meta.get('year')) - self.listing.addItem ("runtime: %sm" % meta.get('runtime')) + self.listing.addItem("Title: %s" % meta.get('title')) + self.listing.addItem("genre: %s" % meta.get('genre')) + self.listing.addItem("rating: %s" % meta.get('rating')) + self.listing.addItem("year: %s" % meta.get('year')) + self.listing.addItem("runtime: %sm" % meta.get('runtime')) if meta.get('thumbnail'): - self.logoimg.setImage (meta.get('thumbnail')) + self.logoimg.setImage(meta.get('thumbnail')) self.plot.setText(meta.get('plot')) - + + def log(msg): try: - xbmc.log("### [%s]: %s" % (__plugin__,msg,), level=xbmc.LOGNOTICE ) + xbmc.log("### [%s]: %s" % (__plugin__, msg,), level=xbmc.LOGNOTICE) except UnicodeEncodeError: - xbmc.log("### [%s]: %s" % (__plugin__,msg.encode("utf-8", "ignore"),), level=xbmc.LOGNOTICE ) + xbmc.log("### [%s]: %s" % (__plugin__, msg.encode("utf-8", "ignore"),), level=xbmc.LOGNOTICE) except: - xbmc.log("### [%s]: %s" % (__plugin__,'ERROR LOG',), level=xbmc.LOGNOTICE ) + xbmc.log("### [%s]: %s" % (__plugin__, 'ERROR LOG',), level=xbmc.LOGNOTICE) + def titleMake(seeds, leechers, size, title): - - #AARRGGBB + # AARRGGBB clGreen = '[COLOR FF008000]%s[/COLOR]' clDodgerblue = '[COLOR FF1E90FF]%s[/COLOR]' clDimgray = '[COLOR FF999999]%s[/COLOR]' @@ -794,8 +848,8 @@ def titleMake(seeds, leechers, size, title): def main(params={}): dialog = SearchWindow("Torrenter Search Window", params) dialog.doModal() - del dialog #You need to delete your instance when it is no longer needed - #because underlying xbmcgui classes are not grabage-collected. + del dialog # You need to delete your instance when it is no longer needed + # because underlying xbmcgui classes are not grabage-collected. if __name__ == '__main__': From 12f1127b4934f7862ef730bf98bbd31642c36a22 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sat, 10 Dec 2016 01:01:06 +0300 Subject: [PATCH 053/126] download status alpha --- Core.py | 2 - Localization.py | 1 + SkorbaLoader.py | 2 +- searchwindow.py | 160 +++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 154 insertions(+), 11 deletions(-) diff --git a/Core.py b/Core.py index 9f2a6c6..0bb1284 100644 --- a/Core.py +++ b/Core.py @@ -423,8 +423,6 @@ class Core: self.drawItem(title, 'DownloadStatus', link, image=img, contextMenu=contextMenu, replaceMenu=False) view_style('DownloadStatus') xbmcplugin.endOfDirectory(handle=int(sys.argv[1]), succeeded=True) - #xbmc.sleep(30000) - #xbmc.executebuiltin('Container.Refresh') return def History(self, params={}): diff --git a/Localization.py b/Localization.py index f0fb88d..135c1ec 100644 --- a/Localization.py +++ b/Localization.py @@ -809,6 +809,7 @@ def localize(text): 'Play (from start)':'Lejátszás (az elejétől)', }, 'ru': { + 'Mass Control':'Массовое Управление', 'Info':'Инфо', 'Delete torrent with files?':'Вы уверены, что хотите удалить торрент с файлами?', 'Fav. / Unfav.':'Доб./удал. Избранное', diff --git a/SkorbaLoader.py b/SkorbaLoader.py index b8e3cd7..6dd3534 100644 --- a/SkorbaLoader.py +++ b/SkorbaLoader.py @@ -285,7 +285,7 @@ class SkorbaLoader: if len(ContentList) == 1 or contentId not in [None, -1]: if not contentId: contentId = 0 title = os.path.basename(ContentList[contentId]['title']) - path = os.path.join(self.storageDirectory, ContentList[contentId]['title']) + path = os.path.join(self.storageDirectory, localize_path(ContentList[contentId]['title'])) type = 'file' else: contentId = -1 diff --git a/searchwindow.py b/searchwindow.py index d31edca..ba636c0 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -67,12 +67,17 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if s_param: self.search(s_param=s_param) else: - self.history() + if __settings__.getSetting('debug') == 'true': + self.downloadstatus() + else: + self.history() def set_controls(self): if not __settings__.getSetting('debug') == 'true': self.background.setImage('%s/icons/%s.png' % (__root__, 'ContentPanel')) + #self.background.setImage('%s/icons/%s.png' % (__root__, 'ContentPanel')) + # Top menu self.button_downloadstatus = pyxbmct.Button("OFF", textColor='0xFF0000FF', focusTexture=self.icon % 'fdownloadstatus', @@ -112,6 +117,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.connect(self.button_search, self.search) self.connect(self.button_controlcenter, self.controlCenter) self.connect(self.button_torrentclient, self.browser) + self.connect(self.button_downloadstatus, self.downloadstatus) self.connect(pyxbmct.ACTION_NAV_BACK, self.close) self.connect(pyxbmct.ACTION_PREVIOUS_MENU, self.close) @@ -240,7 +246,6 @@ class SearchWindow(pyxbmct.AddonDialogWindow): from resources.utorrent.net import Download self.listing.reset() menu, dirs = [], [] - contextMenustring = 'XBMC.RunPlugin(%s)' % ('%s?action=%s&url=%s') % (sys.argv[0], 'uTorrentBrowser', '%s') DownloadList = Download().list() if DownloadList == False: @@ -401,6 +406,134 @@ class SearchWindow(pyxbmct.AddonDialogWindow): return return + def downloadstatus(self): + self.listing.reset() + self.right_menu('downloadstatus') + self.reconnect(pyxbmct.ACTION_NAV_BACK, self.history) + + db = DownloadDB() + items = db.get_all() + + + for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: + jsoninfo = json.loads(urllib.unquote_plus(info)) + + if status != 'stopped' and int(lastupdate) < int(time.time()) - 10: + status = 'stopped' + db.update_status(addtime, status) + + progress = int(jsoninfo.get('progress')) + if status == 'pause': + status_sign = '[||]' + img = os.path.join(__root__, 'icons', 'pause-icon.png') + elif status == 'stopped': + status_sign = '[X]' + img = os.path.join(__root__, 'icons', 'stop-icon.png') + else: + status_sign = '[>]' + if progress == 100: + img = os.path.join(__root__, 'icons', 'upload-icon.png') + else: + img = os.path.join(__root__, 'icons', 'download-icon.png') + + title = '[%d%%]%s %s' % (progress, status_sign, title) + if jsoninfo.get('seeds') != None and jsoninfo.get('peers') != None and \ + jsoninfo.get('download') != None and jsoninfo.get('upload') != None: + d, u = float(jsoninfo['download']) / 1000000, float(jsoninfo['upload']) / 1000000 + s, p = str(jsoninfo['seeds']), str(jsoninfo['peers']) + second = '[D/U %.2f/%.2f (MB/s)][S/L %s/%s]' % (d, u, s, p) + title = dlstat_titleMake('[B]%s[/B]' % title if type == 'folder' else title, second) + + params = {'addtime': addtime, 'type': type, 'path': urllib.quote_plus(path.encode('utf-8')), + 'status': status, 'progress': progress, 'storage': storage} + params['mode'] = 'downloadstatus_subfolder' if type == 'folder' else 'downloadstatus_file' + + self.drawItem(title, params, image=img, isFolder=type == 'folder') + + # def drawItem(self, title, params, image = None, isFolder = False): + if self.listing.size(): + self.setFocus(self.listing) + else: + self.setFocus(self.button_downloadstatus) + return + + def file_browser(self, path, tdir): + + self.listing.reset() + self.right_menu('file_browser') + self.reconnect(pyxbmct.ACTION_NAV_BACK, self.downloadstatus) + + self.drawItem('..', {'mode': 'moveup', 'path': path, 'tdir': tdir}, isFolder=True) + + path = urllib.unquote_plus(path) + dirs, files = xbmcvfs.listdir(path + os.sep) + if len(dirs) > 0: + for dir in dirs: + link = {'mode': 'subfolder', 'path': path, 'tdir': os.path.join(tdir, dir)} + self.drawItem(dir, link, isFolder=True) + for file in files: + link = {'mode': 'file', 'path': path, 'tdir': os.path.join(tdir, file)} + self.drawItem(file, link, isFolder=False) + + def downloadstatus_action(self, action, addtime, path, type, progress, storage): + + db = DownloadDB() + + if action == 'play': + if type == 'file' and progress > 30: + xbmc.Player().play(urllib.unquote_plus(path)) + elif type == 'folder' and progress == 100: + self.file_browser(path, path) + else: + showMessage(self.localize('Download Status'), self.localize('Download has not finished yet')) + + if action == 'delete': + db.delete(addtime) + showMessage(self.localize('Download Status'), self.localize('Stopped and Deleted!')) + + if action == 'pause': + db.update_status(addtime, 'pause') + showMessage(self.localize('Download Status'), self.localize('Paused!')) + + if action == 'stop': + db.update_status(addtime, 'stopped') + showMessage(self.localize('Download Status'), self.localize('Stopped!')) + + if action == 'start': + if 'status' == 'pause': + db.update_status(addtime, 'downloading') + showMessage(self.localize('Download Status'), self.localize('Unpaused!')) + else: + start = db.get_byaddtime(addtime) + torrent, ind = start[6], start[7] + start_exec = 'XBMC.RunPlugin(%s)' % ('%s?action=%s&url=%s&ind=%s&storage=%s') % ( + sys.argv[0], 'downloadLibtorrent', urllib.quote_plus(torrent.encode('utf-8')), str(ind), storage) + xbmc.executebuiltin(start_exec) + showMessage(self.localize('Download Status'), self.localize('Started!')) + + if action == 'startall': + items = db.get_all() + if items: + for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: + start_exec = 'XBMC.RunPlugin(%s)' % ('%s?action=%s&url=%s&ind=%s&storage=%s') % ( + sys.argv[0], 'downloadLibtorrent', urllib.quote_plus(torrent.encode('utf-8')), str(ind), + urllib.quote_plus(storage.encode('utf-8'))) + xbmc.executebuiltin(start_exec) + xbmc.sleep(1000) + showMessage(self.localize('Download Status'), self.localize('Started All!')) + + if action == 'stopall': + items = db.get_all() + if items: + for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: + db.update_status(addtime, 'stopped') + xbmc.sleep(1000) + showMessage(self.localize('Download Status'), self.localize('Stopped All!')) + + if action == 'clear': + db.clear() + showMessage(self.localize('Download Status'), self.localize('Clear!')) + def open_torrent(self, link, tdir=None): # cache if link != self.last_link: @@ -442,8 +575,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.localize('Download via Libtorrent'), self.localize('Info'),] elif mode in ['torrent_subfolder', 'torrent_moveup', - 'browser_moveup']: + 'browser_moveup', 'file_browser', 'subfolder']: label_list = [self.localize('Open'),] + elif mode in ['file']: + label_list = [self.localize('Play'), ] elif mode in ['history', 'history_search_item']: label_list = [self.localize('Open'), self.localize('Edit'), @@ -463,7 +598,12 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.localize('High Priority'), self.localize('Skip All Files'), self.localize('Copy in Root'), ] - + elif mode in ['downloadstatus', 'downloadstatus_subfolder']: + label_list = [self.localize('Open'), self.localize('Start'), self.localize('Pause'), + self.localize('Stop'), self.localize('Delete'), self.localize('Mass Control'),] + elif mode in ['downloadstatus_file']: + label_list = [self.localize('Play'), self.localize('Start'), self.localize('Pause'), + self.localize('Stop'), self.localize('Delete'), self.localize('Mass Control'),] return label_list def context(self): @@ -770,10 +910,6 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def version_check(self): return False if int(xbmc.getInfoLabel("System.BuildVersion")[:2]) < 17 else True - def onFocus(self): - log(str(self.getFocusId())) - - class InfoWindow(pyxbmct.AddonDialogWindow): def __init__(self, title="", year=""): super(InfoWindow, self).__init__(title) @@ -844,6 +980,14 @@ def titleMake(seeds, leechers, size, title): title += '\r\n' + clDimgray % second return title +def dlstat_titleMake(title, second): + # AARRGGBB + clDimgray = '[COLOR FF999999]%s[/COLOR]' + clWhite = '[COLOR FFFFFFFF]%s[/COLOR]' + title = clWhite % title + title += '\r\n' + clDimgray % second + return title + def main(params={}): dialog = SearchWindow("Torrenter Search Window", params) From cd830f16674571459ca327a76ed87975543185bd Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sun, 11 Dec 2016 01:13:58 +0300 Subject: [PATCH 054/126] watched history --- Core.py | 3 +- Localization.py | 4 +- SkorbaLoader.py | 19 +- icons/searchwindow/button.psd | Bin 917812 -> 983334 bytes searchwindow.py | 332 ++++++++++++++++++++++++---------- 5 files changed, 251 insertions(+), 107 deletions(-) diff --git a/Core.py b/Core.py index 0bb1284..57b3c47 100644 --- a/Core.py +++ b/Core.py @@ -523,7 +523,7 @@ class Core: self.__settings__.setSetting("lastTorrent", path) xbmc.executebuiltin( 'XBMC.ActivateWindow(%s)' % 'Videos,plugin://plugin.video.torrenter/?action=%s&url=%s' - % ('torrentPlayer', path)) + % ('torrentPlayer', path.encode('utf-8'))) if action2 == 'playnoseek' or action2 == 'playwithseek': filename, path, url, seek, length, ind = db.get('filename, path, url, seek, length, ind', 'addtime', str(addtime)) @@ -1837,7 +1837,6 @@ class Core: int(self.__settings__.getSetting("download_limit")) * 1000000 / 8) #MBits/second torrent.downloadProcess(ind, encryption) showMessage(self.localize('Download Status'), self.localize('Added!')) - xbmcplugin.endOfDirectory(handle=int(sys.argv[1]), succeeded=True) def titleMake(self, seeds, leechers, size, title): diff --git a/Localization.py b/Localization.py index 135c1ec..9d963e0 100644 --- a/Localization.py +++ b/Localization.py @@ -809,6 +809,8 @@ def localize(text): 'Play (from start)':'Lejátszás (az elejétől)', }, 'ru': { + 'Clear History': 'Очистить Историю', + 'Play (with seek)': 'Играть (перемотка)', 'Mass Control':'Массовое Управление', 'Info':'Инфо', 'Delete torrent with files?':'Вы уверены, что хотите удалить торрент с файлами?', @@ -900,7 +902,7 @@ def localize(text): 'Checking preloaded files...': 'Проверка файлов...', 'Waiting for website response...': 'Ожидание ответа сайта...', 'Search and cache information for:': 'Поиск и кэширование информации для:', - 'Open Torrent': 'Открыть Список файлов', + 'Open Torrent': 'Открыть Торрент', 'Torrent list is empty.': 'Список раздач пуст.', 'Content Lists': 'Списки Медиа', 'Canceled by User': 'Отменено пользователем', diff --git a/SkorbaLoader.py b/SkorbaLoader.py index 6dd3534..e23e6ef 100644 --- a/SkorbaLoader.py +++ b/SkorbaLoader.py @@ -32,7 +32,7 @@ import xbmcgui import xbmcvfs import Localization from functions import isSubtitle, DownloadDB, log, debug, is_writable,\ - vista_check, windows_check, localize_path + vista_check, windows_check, localize_path, decode_str class SkorbaLoader: magnetLink = None @@ -127,7 +127,7 @@ class SkorbaLoader: return if not xbmcvfs.exists(self.torrentFilesPath): xbmcvfs.mkdirs(self.torrentFilesPath) - newFile = self.torrentFilesPath + self.md5(torrentUrl) + '.torrent' + newFile = localize_path(self.torrentFilesPath + self.md5(torrentUrl) + '.torrent') if newFile != torrentFile: if xbmcvfs.exists(newFile): xbmcvfs.delete(newFile) @@ -285,12 +285,12 @@ class SkorbaLoader: if len(ContentList) == 1 or contentId not in [None, -1]: if not contentId: contentId = 0 title = os.path.basename(ContentList[contentId]['title']) - path = os.path.join(self.storageDirectory, localize_path(ContentList[contentId]['title'])) + path = localize_path(os.path.join(self.storageDirectory, ContentList[contentId]['title'])) type = 'file' else: contentId = -1 title = ContentList[0]['title'].split('\\')[0] - path = os.path.join(self.storageDirectory, title) + path = localize_path(os.path.join(self.storageDirectory, title)) type = 'folder' add = db.add(title, path, type, {'progress': 0}, 'downloading', self.torrentFile, contentId, @@ -307,11 +307,18 @@ class SkorbaLoader: thread.start_new_thread(self.downloadLoop, (title,)) def downloadLoop(self, title): + log(title) db = DownloadDB() status = 'downloading' while db.get(title) and status != 'stopped': xbmc.sleep(3000) + log('status 1 '+status) status = db.get_status(title) + log('status 2 ' + status) + if status == 'stopped': + xbmc.sleep(10000) + status = db.get_status(title) + log('status 3 ' + status) if not self.paused: if status == 'pause': self.paused = True @@ -329,7 +336,9 @@ class SkorbaLoader: iterator = int(s.progress * 100) info['progress'] = iterator db.update(title, info) - #self.debug() + log(title+str(info)) + self.debug() + log('out of downloadLoop') self.session.remove_torrent(self.torrentHandle) return diff --git a/icons/searchwindow/button.psd b/icons/searchwindow/button.psd index feaf4c6f48a1d687267490cb68707184cd2124f2..2965a22dcf012b0336d8a5539cef75b1631f7f8c 100644 GIT binary patch delta 93193 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 N{+RoCzrOhJ{{g?b;6MNX delta 29997 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 3*60 else 0 + watchedPercent = int((float(seek) / float(length)) * 100) + duration = '%02d:%02d:%02d' % ((length / (60*60)), (length / 60) % 60, length % 60) + title = '[%d%%][%s] %s [%d MB]' %\ + (watchedPercent, duration, filename.encode('utf-8'), int(size)) + clDimgray = '[COLOR FF696969]%s[/COLOR]' + clWhite = '[COLOR FFFFFFFF]%s[/COLOR]' + + title = clWhite % title + chr(10) + clDimgray % '(%s)' % foldername.encode('utf-8') + + if watchedPercent >= 85: + img = __root__ + '/icons/stop-icon.png' + else: + img = __root__ + '/icons/pause-icon.png' + + + link = {'mode': 'watched_item', 'addtime': str(addtime)} + self.drawItem(title, link, image=img) + + + def watched_action(self, action, addtime): + db = WatchedHistoryDB() + + if action == 'delete': + db.delete(addtime) + showMessage(self.localize('Watched History'), self.localize('Deleted!')) + self.watched() + + if action == 'open': + filename, foldername, path, url, seek, length, ind = db.get('filename, foldername, path, url, seek, length, ind', 'addtime', str(addtime)) + self.reconnect(pyxbmct.ACTION_NAV_BACK, self.watched) + self.open_torrent(path.encode('utf-8')) + + if action == 'playnoseek' or action == 'playwithseek': + filename, path, url, seek, length, ind = db.get('filename, path, url, seek, length, ind', 'addtime', str(addtime)) + + if action == 'playwithseek': + seek = int(seek) + else: + seek = 0 + + if os.path.exists(path): + __settings__.setSetting("lastTorrent", path) + else: + from Downloader import Downloader + torrent = Downloader.Torrent(self.userStorageDirectory, torrentFilesDirectory=self.torrentFilesDirectory) + __settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) + xbmc.executebuiltin('xbmc.RunPlugin("plugin://plugin.video.torrenter/?action=playTorrent&url='+str(ind)+'&seek='+str(seek)+'")') + self.close() + + if action == 'clear': + db.clear() + showMessage(self.localize('Watched History'), self.localize('Clear!')) + self.watched() + def browser(self, hash = None, tdir = None): from resources.utorrent.net import Download self.listing.reset() @@ -345,8 +418,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): folder = data['dir'] break if isRemoteTorr(): - torrent_dir = self.__settings__.getSetting("torrent_dir") - torrent_replacement = self.__settings__.getSetting("torrent_replacement") + torrent_dir = __settings__.getSetting("torrent_dir") + torrent_replacement = __settings__.getSetting("torrent_replacement") empty = [None, ''] if torrent_dir in empty or torrent_replacement in empty: if xbmcgui.Dialog().yesno( @@ -355,7 +428,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.localize('For example /media/dl_torr/ to smb://SERVER/dl_torr/. Setup now?')): if torrent_dir in empty: torrent_dir() - self.__settings__.openSettings() + __settings__.openSettings() return folder = folder.replace(torrent_dir, torrent_replacement) @@ -414,41 +487,41 @@ class SearchWindow(pyxbmct.AddonDialogWindow): db = DownloadDB() items = db.get_all() + if items: + for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: + jsoninfo = json.loads(urllib.unquote_plus(info)) - for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: - jsoninfo = json.loads(urllib.unquote_plus(info)) + if status != 'stopped' and int(lastupdate) < int(time.time()) - 10: + status = 'stopped' + db.update_status(addtime, status) - if status != 'stopped' and int(lastupdate) < int(time.time()) - 10: - status = 'stopped' - db.update_status(addtime, status) - - progress = int(jsoninfo.get('progress')) - if status == 'pause': - status_sign = '[||]' - img = os.path.join(__root__, 'icons', 'pause-icon.png') - elif status == 'stopped': - status_sign = '[X]' - img = os.path.join(__root__, 'icons', 'stop-icon.png') - else: - status_sign = '[>]' - if progress == 100: - img = os.path.join(__root__, 'icons', 'upload-icon.png') + progress = int(jsoninfo.get('progress')) + if status == 'pause': + status_sign = '[||]' + img = os.path.join(__root__, 'icons', 'pause-icon.png') + elif status == 'stopped': + status_sign = '[X]' + img = os.path.join(__root__, 'icons', 'stop-icon.png') else: - img = os.path.join(__root__, 'icons', 'download-icon.png') + status_sign = '[>]' + if progress == 100: + img = os.path.join(__root__, 'icons', 'upload-icon.png') + else: + img = os.path.join(__root__, 'icons', 'download-icon.png') - title = '[%d%%]%s %s' % (progress, status_sign, title) - if jsoninfo.get('seeds') != None and jsoninfo.get('peers') != None and \ - jsoninfo.get('download') != None and jsoninfo.get('upload') != None: - d, u = float(jsoninfo['download']) / 1000000, float(jsoninfo['upload']) / 1000000 - s, p = str(jsoninfo['seeds']), str(jsoninfo['peers']) - second = '[D/U %.2f/%.2f (MB/s)][S/L %s/%s]' % (d, u, s, p) - title = dlstat_titleMake('[B]%s[/B]' % title if type == 'folder' else title, second) + title = '[%d%%]%s %s' % (progress, status_sign, title) + if jsoninfo.get('seeds') != None and jsoninfo.get('peers') != None and \ + jsoninfo.get('download') != None and jsoninfo.get('upload') != None: + d, u = float(jsoninfo['download']) / 1000000, float(jsoninfo['upload']) / 1000000 + s, p = str(jsoninfo['seeds']), str(jsoninfo['peers']) + second = '[D/U %.2f/%.2f (MB/s)][S/L %s/%s]' % (d, u, s, p) + title = dlstat_titleMake('[B]%s[/B]' % title if type == 'folder' else title, second) - params = {'addtime': addtime, 'type': type, 'path': urllib.quote_plus(path.encode('utf-8')), - 'status': status, 'progress': progress, 'storage': storage} - params['mode'] = 'downloadstatus_subfolder' if type == 'folder' else 'downloadstatus_file' + params = {'addtime': addtime, 'type': type, 'path': path, + 'status': status, 'progress': progress, 'storage': storage} + params['mode'] = 'downloadstatus_subfolder' if type == 'folder' else 'downloadstatus_file' - self.drawItem(title, params, image=img, isFolder=type == 'folder') + self.drawItem(title, params, image=img, isFolder=type == 'folder') # def drawItem(self, title, params, image = None, isFolder = False): if self.listing.size(): @@ -457,89 +530,121 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.setFocus(self.button_downloadstatus) return - def file_browser(self, path, tdir): - - self.listing.reset() - self.right_menu('file_browser') - self.reconnect(pyxbmct.ACTION_NAV_BACK, self.downloadstatus) - - self.drawItem('..', {'mode': 'moveup', 'path': path, 'tdir': tdir}, isFolder=True) - - path = urllib.unquote_plus(path) - dirs, files = xbmcvfs.listdir(path + os.sep) - if len(dirs) > 0: - for dir in dirs: - link = {'mode': 'subfolder', 'path': path, 'tdir': os.path.join(tdir, dir)} - self.drawItem(dir, link, isFolder=True) - for file in files: - link = {'mode': 'file', 'path': path, 'tdir': os.path.join(tdir, file)} - self.drawItem(file, link, isFolder=False) - def downloadstatus_action(self, action, addtime, path, type, progress, storage): db = DownloadDB() if action == 'play': - if type == 'file' and progress > 30: - xbmc.Player().play(urllib.unquote_plus(path)) - elif type == 'folder' and progress == 100: - self.file_browser(path, path) + if type == 'file' and progress > 30 or progress == 100: + self.file_browser(type, path, path) else: showMessage(self.localize('Download Status'), self.localize('Download has not finished yet')) - if action == 'delete': + elif action == 'delete': db.delete(addtime) showMessage(self.localize('Download Status'), self.localize('Stopped and Deleted!')) - if action == 'pause': + elif action == 'pause': db.update_status(addtime, 'pause') showMessage(self.localize('Download Status'), self.localize('Paused!')) - if action == 'stop': + elif action == 'stop': db.update_status(addtime, 'stopped') showMessage(self.localize('Download Status'), self.localize('Stopped!')) - if action == 'start': - if 'status' == 'pause': + elif action == 'start': + start = db.get_byaddtime(addtime) + if start[5] == 'pause': db.update_status(addtime, 'downloading') showMessage(self.localize('Download Status'), self.localize('Unpaused!')) else: - start = db.get_byaddtime(addtime) torrent, ind = start[6], start[7] - start_exec = 'XBMC.RunPlugin(%s)' % ('%s?action=%s&url=%s&ind=%s&storage=%s') % ( - sys.argv[0], 'downloadLibtorrent', urllib.quote_plus(torrent.encode('utf-8')), str(ind), storage) - xbmc.executebuiltin(start_exec) + + from Core import Core + params = {'url': torrent.encode('utf-8'), + 'ind': str(ind), 'storage': storage.encode('utf-8')} + + del db + + import SkorbaLoader + __settings__.setSetting("lastTorrent", torrent.encode('utf-8')) + torrent = SkorbaLoader.SkorbaLoader(storage.encode('utf-8'), torrent.encode('utf-8')) + encryption = __settings__.getSetting('encryption') == 'true' + torrent.downloadProcess(str(ind), encryption) + #start_exec = self.form_link('downloadLibtorrent', + # {'url': torrent.encode('utf-8'), + # 'ind': str(ind), 'storage': storage.encode('utf-8')}) + #log(start_exec) + #xbmc.executebuiltin('XBMC.RunPlugin(%s)' % start_exec) showMessage(self.localize('Download Status'), self.localize('Started!')) - if action == 'startall': - items = db.get_all() - if items: - for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: - start_exec = 'XBMC.RunPlugin(%s)' % ('%s?action=%s&url=%s&ind=%s&storage=%s') % ( - sys.argv[0], 'downloadLibtorrent', urllib.quote_plus(torrent.encode('utf-8')), str(ind), - urllib.quote_plus(storage.encode('utf-8'))) - xbmc.executebuiltin(start_exec) - xbmc.sleep(1000) - showMessage(self.localize('Download Status'), self.localize('Started All!')) + elif action == 'masscontrol': + dialog_items = [self.localize('Start All'), self.localize('Stop All'), + self.localize('Clear %s') % self.localize('Download Status'), self.localize('Cancel')] + ret = xbmcgui.Dialog().select(self.localize('Mass Control'), dialog_items) + if ret == 0: + items = db.get_all() + if items: + for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: + start_exec = self.form_link('downloadLibtorrent', + {'url':torrent.encode('utf-8'), + 'ind':str(ind), 'storage':storage.encode('utf-8')}) + log(start_exec) + xbmc.executebuiltin('XBMC.RunScript(%s)' % start_exec) + xbmc.sleep(1000) + showMessage(self.localize('Download Status'), self.localize('Started All!')) + elif ret == 1: + items = db.get_all() + if items: + for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: + db.update_status(addtime, 'stopped') + xbmc.sleep(1000) + showMessage(self.localize('Download Status'), self.localize('Stopped All!')) + elif ret == 2: + db.clear() + showMessage(self.localize('Download Status'), self.localize('Clear!')) - if action == 'stopall': - items = db.get_all() - if items: - for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: - db.update_status(addtime, 'stopped') - xbmc.sleep(1000) - showMessage(self.localize('Download Status'), self.localize('Stopped All!')) + xbmc.sleep(1000) + self.downloadstatus() - if action == 'clear': - db.clear() - showMessage(self.localize('Download Status'), self.localize('Clear!')) + def file_browser(self, mode, path, tdir): + + path = encode_msg(path) + tdir = encode_msg(tdir) + + self.listing.reset() + if tdir == os.path.dirname(path): + self.downloadstatus() + elif mode == 'file': + xbmc.Player().play(localize_path(tdir)) + self.close() + else: + self.right_menu('file_browser') + self.reconnect(pyxbmct.ACTION_NAV_BACK, self.downloadstatus) + + self.drawItem('..', {'mode': 'moveup', 'path': path, + 'tdir': os.path.dirname(tdir)}, isFolder=True) + + dirs, files = xbmcvfs.listdir(tdir + os.sep) + if len(dirs) > 0: + for dir in dirs: + link = {'mode': 'subfolder', 'path': path, 'type': 'folder', + 'tdir': os.path.join(tdir, dir)} + self.drawItem(dir, link, isFolder=True) + for file in files: + link = {'mode': 'file', 'path': path, 'type': 'file', + 'tdir': os.path.join(tdir, file)} + self.drawItem(file, link, isFolder=False) + if self.listing.size(): + self.setFocus(self.listing) + else: + self.setFocus(self.button_downloadstatus) def open_torrent(self, link, tdir=None): # cache if link != self.last_link: self.contentList = get_contentList(link) self.last_link = link - self.reconnect(pyxbmct.ACTION_NAV_BACK, self.search) dirList, contentListNew = cutFolder(self.contentList, tdir) @@ -585,7 +690,6 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.localize('Individual Tracker Options'), self.localize('Fav. / Unfav.'), self.localize('Delete')] - elif mode in ['browser', 'browser_item']: label_list = [self.localize('Open'), self.localize('Start'), self.localize('Stop'), self.localize('Remove'), self.localize('High Priority'), @@ -604,6 +708,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): elif mode in ['downloadstatus_file']: label_list = [self.localize('Play'), self.localize('Start'), self.localize('Pause'), self.localize('Stop'), self.localize('Delete'), self.localize('Mass Control'),] + elif mode in ['watched', 'watched_item']: + label_list = [self.localize('Open Torrent'), self.localize('Play (from start)'), + self.localize('Play (with seek)'), self.localize('Delete'), self.localize('Clear History'), ] return label_list def context(self): @@ -738,6 +845,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): tdir = params.get('tdir') self.listing.reset() if mode in ['search_item', 'torrent_subfolder']: + self.reconnect(pyxbmct.ACTION_NAV_BACK, self.search) self.open_torrent(filename, tdir) elif mode == 'torrent_moveup': self.search() @@ -750,13 +858,18 @@ class SearchWindow(pyxbmct.AddonDialogWindow): addtime = params.get('addtime') self.input_search.setText(filename) self.search(addtime) - elif mode in ['browser_item', 'browser_subfolder']: - self.browser(hash, tdir) - elif mode == 'browser_moveup': + elif mode in ['browser_item', 'browser_subfolder', 'browser_moveup']: self.browser(hash, tdir) elif mode == 'browser_file': self.browser_action(hash, 'play', tdir = tdir, ind = ind) self.close() + elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: + self.downloadstatus_action('play', params.get('addtime'), params.get('path'), + params.get('type'), params.get('progress'), params.get('storage')) + elif mode in ['moveup', 'subfolder', 'file']: + self.file_browser(params.get('type'), params.get('path'), tdir) + elif mode == 'watched_item': + self.watched_action('open', params.get('addtime')) def right_press2(self): item = self.listing.getSelectedItem() @@ -785,6 +898,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.browser_action(hash, '3', tdir=tdir, ind=ind) elif mode == 'browser_file': self.browser_action(hash, '3', tdir=tdir, ind=ind) + elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: + self.downloadstatus_action('start', params.get('addtime'), params.get('path'), + params.get('type'), params.get('progress'), params.get('storage')) + elif mode == 'watched_item': + self.watched_action('playnoseek', params.get('addtime')) def right_press3(self): item = self.listing.getSelectedItem() @@ -813,6 +931,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.browser_action(hash, '0', tdir=tdir, ind=ind) elif mode == 'browser_file': self.browser_action(hash, '0', tdir=tdir, ind=ind) + elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: + self.downloadstatus_action('pause', params.get('addtime'), params.get('path'), + params.get('type'), params.get('progress'), params.get('storage')) + elif mode == 'watched_item': + self.watched_action('playwithseek', params.get('addtime')) def right_press4(self): item = self.listing.getSelectedItem() @@ -837,6 +960,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.browser() elif mode == 'browser_subfolder': self.browser_action(hash, 'copy', tdir=tdir, ind=ind) + elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: + self.downloadstatus_action('stop', params.get('addtime'), params.get('path'), + params.get('type'), params.get('progress'), params.get('storage')) + elif mode == 'watched_item': + self.watched_action('delete', params.get('addtime')) def right_press5(self): item = self.listing.getSelectedItem() @@ -850,6 +978,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.history_action('delete', addtime, fav) elif mode == 'browser_item': self.browser_action(hash, '3') + elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: + self.downloadstatus_action('delete', params.get('addtime'), params.get('path'), + params.get('type'), params.get('progress'), params.get('storage')) + elif mode == 'watched_item': + self.watched_action('clear', params.get('addtime')) def right_press6(self): item = self.listing.getSelectedItem() @@ -859,6 +992,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): hash = params.get('hash') if mode == 'browser_item': self.browser_action(hash, '0') + elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: + self.downloadstatus_action('masscontrol', params.get('addtime'), params.get('path'), + params.get('type'), params.get('progress'), params.get('storage')) def right_press7(self): item = self.listing.getSelectedItem() @@ -955,7 +1091,6 @@ class InfoWindow(pyxbmct.AddonDialogWindow): self.logoimg.setImage(meta.get('thumbnail')) self.plot.setText(meta.get('plot')) - def log(msg): try: xbmc.log("### [%s]: %s" % (__plugin__, msg,), level=xbmc.LOGNOTICE) @@ -964,7 +1099,6 @@ def log(msg): except: xbmc.log("### [%s]: %s" % (__plugin__, 'ERROR LOG',), level=xbmc.LOGNOTICE) - def titleMake(seeds, leechers, size, title): # AARRGGBB clGreen = '[COLOR FF008000]%s[/COLOR]' From 7e98f5a8d09f642f477017f5b909477596903666 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sun, 11 Dec 2016 01:14:23 +0300 Subject: [PATCH 055/126] watched history --- icons/searchwindow/fwatched.png | Bin 0 -> 5273 bytes icons/searchwindow/nfwatched.png | Bin 0 -> 5368 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 icons/searchwindow/fwatched.png create mode 100644 icons/searchwindow/nfwatched.png diff --git a/icons/searchwindow/fwatched.png b/icons/searchwindow/fwatched.png new file mode 100644 index 0000000000000000000000000000000000000000..07917e1d00afe54765cbff0560ca4d1abd887d8d GIT binary patch literal 5273 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 Date: Mon, 12 Dec 2016 19:28:00 +0300 Subject: [PATCH 056/126] window dl status --- Core.py | 7 ++++--- Localization.py | 1 + SkorbaLoader.py | 17 +++++------------ searchwindow.py | 29 ++++++++++++----------------- 4 files changed, 22 insertions(+), 32 deletions(-) diff --git a/Core.py b/Core.py index 57b3c47..87afe7d 100644 --- a/Core.py +++ b/Core.py @@ -1235,7 +1235,7 @@ class Core: filename = os.path.join(folder, filename) xbmc.executebuiltin('xbmc.PlayMedia("' + filename.encode('utf-8') + '")') elif tdir and action == 'copy': - path=os.path.join(folder, tdir) + path=os.path.join(localize_path(folder), localize_path(tdir)) dirs, files=xbmcvfs.listdir(path) if len(dirs) > 0: dirs.insert(0, self.localize('./ (Root folder)')) @@ -1250,9 +1250,10 @@ class Core: path=os.path.join(path, dirs[ret]) dirs, files=xbmcvfs.listdir(path) for file in files: - if not xbmcvfs.exists(os.path.join(path,file)): + file = localize_path(file) + if not xbmcvfs.exists(os.path.join(path, file)): xbmcvfs.delete(os.path.join(path,file)) - xbmcvfs.copy(os.path.join(path,file),os.path.join(folder,file)) + xbmcvfs.copy(os.path.join(path, file),os.path.join(folder,file)) i=i+1 showMessage(self.localize('Torrent-client Browser'), self.localize('Copied %d files!') % i, forced=True) return diff --git a/Localization.py b/Localization.py index 9d963e0..8fd714b 100644 --- a/Localization.py +++ b/Localization.py @@ -809,6 +809,7 @@ def localize(text): 'Play (from start)':'Lejátszás (az elejétől)', }, 'ru': { + 'Cancel': 'Отмена', 'Clear History': 'Очистить Историю', 'Play (with seek)': 'Играть (перемотка)', 'Mass Control':'Массовое Управление', diff --git a/SkorbaLoader.py b/SkorbaLoader.py index e23e6ef..fb0cdd7 100644 --- a/SkorbaLoader.py +++ b/SkorbaLoader.py @@ -285,12 +285,12 @@ class SkorbaLoader: if len(ContentList) == 1 or contentId not in [None, -1]: if not contentId: contentId = 0 title = os.path.basename(ContentList[contentId]['title']) - path = localize_path(os.path.join(self.storageDirectory, ContentList[contentId]['title'])) + path = os.path.join(self.storageDirectory, ContentList[contentId]['title']) type = 'file' else: contentId = -1 title = ContentList[0]['title'].split('\\')[0] - path = localize_path(os.path.join(self.storageDirectory, title)) + path = os.path.join(self.storageDirectory, title) type = 'folder' add = db.add(title, path, type, {'progress': 0}, 'downloading', self.torrentFile, contentId, @@ -304,21 +304,14 @@ class SkorbaLoader: else: for i in range(self.torrentFileInfo.num_pieces()): self.torrentHandle.piece_priority(i, 6) + del db thread.start_new_thread(self.downloadLoop, (title,)) def downloadLoop(self, title): - log(title) db = DownloadDB() status = 'downloading' while db.get(title) and status != 'stopped': - xbmc.sleep(3000) - log('status 1 '+status) status = db.get_status(title) - log('status 2 ' + status) - if status == 'stopped': - xbmc.sleep(10000) - status = db.get_status(title) - log('status 3 ' + status) if not self.paused: if status == 'pause': self.paused = True @@ -336,8 +329,8 @@ class SkorbaLoader: iterator = int(s.progress * 100) info['progress'] = iterator db.update(title, info) - log(title+str(info)) - self.debug() + #self.debug() + xbmc.sleep(3000) log('out of downloadLoop') self.session.remove_torrent(self.torrentHandle) return diff --git a/searchwindow.py b/searchwindow.py index 576f64e..4a0522e 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -80,7 +80,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): #self.background.setImage('%s/icons/%s.png' % (__root__, 'ContentPanel')) # Top menu - self.button_downloadstatus = pyxbmct.Button("OFF", textColor='0xFF0000FF', + self.button_downloadstatus = pyxbmct.Button("", focusTexture=self.icon % 'fdownloadstatus', noFocusTexture=self.icon % 'nfdownloadstatus') self.placeControl(self.button_downloadstatus, 0, 1, 1, 1) @@ -560,23 +560,15 @@ class SearchWindow(pyxbmct.AddonDialogWindow): else: torrent, ind = start[6], start[7] - from Core import Core - params = {'url': torrent.encode('utf-8'), - 'ind': str(ind), 'storage': storage.encode('utf-8')} - del db import SkorbaLoader __settings__.setSetting("lastTorrent", torrent.encode('utf-8')) - torrent = SkorbaLoader.SkorbaLoader(storage.encode('utf-8'), torrent.encode('utf-8')) + torrent = SkorbaLoader.SkorbaLoader(storage.encode('utf-8'), torrent) encryption = __settings__.getSetting('encryption') == 'true' - torrent.downloadProcess(str(ind), encryption) - #start_exec = self.form_link('downloadLibtorrent', - # {'url': torrent.encode('utf-8'), - # 'ind': str(ind), 'storage': storage.encode('utf-8')}) - #log(start_exec) - #xbmc.executebuiltin('XBMC.RunPlugin(%s)' % start_exec) + torrent.downloadProcess(ind, encryption) showMessage(self.localize('Download Status'), self.localize('Started!')) + xbmc.sleep(1000) elif action == 'masscontrol': dialog_items = [self.localize('Start All'), self.localize('Stop All'), @@ -584,14 +576,17 @@ class SearchWindow(pyxbmct.AddonDialogWindow): ret = xbmcgui.Dialog().select(self.localize('Mass Control'), dialog_items) if ret == 0: items = db.get_all() + del db if items: + import SkorbaLoader for addtime, title, path, type, info, status, torrent, ind, lastupdate, storage in items: - start_exec = self.form_link('downloadLibtorrent', - {'url':torrent.encode('utf-8'), - 'ind':str(ind), 'storage':storage.encode('utf-8')}) - log(start_exec) - xbmc.executebuiltin('XBMC.RunScript(%s)' % start_exec) + __settings__.setSetting("lastTorrent", torrent.encode('utf-8')) + torrent = SkorbaLoader.SkorbaLoader(storage.encode('utf-8'), torrent) + encryption = __settings__.getSetting('encryption') == 'true' + torrent.downloadProcess(ind, encryption) xbmc.sleep(1000) + + xbmc.sleep(2000) showMessage(self.localize('Download Status'), self.localize('Started All!')) elif ret == 1: items = db.get_all() From ef180cc215f36649e36697a5a5a9b0b122fddfcd Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Tue, 13 Dec 2016 19:12:14 +0300 Subject: [PATCH 057/126] :// protocol for mancuniancol --- AceStream.py | 42 +++++++++++++++++++++++++++++------------- Anteoloader.py | 38 +++++++++++++++++++++++++++----------- Inposloader.py | 39 +++++++++++++++++++++++++++------------ SkorbaLoader.py | 44 +++++++++++++++++++++++++++++--------------- 4 files changed, 112 insertions(+), 51 deletions(-) diff --git a/AceStream.py b/AceStream.py index 8d7137f..dda3cfc 100644 --- a/AceStream.py +++ b/AceStream.py @@ -25,7 +25,7 @@ import hashlib import re import base64 from StringIO import StringIO -import gzip +import zlib from functions import file_decode, file_encode from functions import magnet_alert, log, debug @@ -93,19 +93,12 @@ class AceStream: torrentFile = self.storageDirectory + os.sep + self.torrentFilesDirectory + os.sep + self.md5( torrentUrl) + '.torrent' try: - if not re.match("^http\:.+$", torrentUrl): - content = xbmcvfs.File(file_decode(torrentUrl), "rb").read() + if not re.match("^[htps]+?://.+$|^://.+$", torrentUrl): + log('xbmcvfs.File for %s' % torrentUrl) + content = xbmcvfs.File(torrentUrl, "rb").read() else: - request = urllib2.Request(torrentUrl) - request.add_header('Referer', torrentUrl) - request.add_header('Accept-encoding', 'gzip') - result = urllib2.urlopen(request) - if result.info().get('Content-Encoding') == 'gzip': - buf = StringIO(result.read()) - f = gzip.GzipFile(fileobj=buf) - content = f.read() - else: - content = result.read() + log('request for %s' % torrentUrl) + content = self.makeRequest(torrentUrl) localFile = xbmcvfs.File(torrentFile, "w+b") localFile.write(content) @@ -119,6 +112,29 @@ class AceStream: self.torrentFileInfo = self.TSplayer.load_torrent(base64.b64encode(content), 'RAW') return self.torrentFile + def makeRequest(self, torrentUrl): + torrentUrl = re.sub('^://', 'http://', torrentUrl) + x = re.search("://(.+?)/|://(.+?)$", torrentUrl) + if x: + baseurl = x.group(1) if x.group(1) else x.group(2) + else: + baseurl ='' + + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://%s/' % baseurl), ('Accept-encoding', 'gzip'), ] + + opener = urllib2.build_opener() + opener.addheaders = headers + result = opener.open(torrentUrl) + if result.info().get('Content-Encoding') == 'gzip': + buf = StringIO(result.read()) + decomp = zlib.decompressobj(16 + zlib.MAX_WBITS) + content = decomp.decompress(buf.getvalue()) + else: + content = result.read() + return content + def magnetToTorrent(self, magnet): try: from SkorbaLoader import SkorbaLoader diff --git a/Anteoloader.py b/Anteoloader.py index 4eae5fa..3ec1105 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -200,19 +200,12 @@ class AnteoLoader: if not xbmcvfs.exists(self.torrentFilesPath): xbmcvfs.mkdirs(self.torrentFilesPath) torrentFile = os.path.join(self.torrentFilesPath, self.md5(torrentUrl) + '.torrent') try: - if not re.match("^http\:.+$", torrentUrl): + if not re.match("^[htps]+?://.+$|^://.+$", torrentUrl): + log('xbmcvfs.File for %s' % torrentUrl) content = xbmcvfs.File(torrentUrl, "rb").read() else: - request = urllib2.Request(torrentUrl) - request.add_header('Referer', torrentUrl) - request.add_header('Accept-encoding', 'gzip') - result = urllib2.urlopen(request) - if result.info().get('Content-Encoding') == 'gzip': - buf = StringIO(result.read()) - decomp = zlib.decompressobj(16 + zlib.MAX_WBITS) - content = decomp.decompress(buf.getvalue()) - else: - content = result.read() + log('request for %s' % torrentUrl) + content = self.makeRequest(torrentUrl) localFile = xbmcvfs.File(torrentFile, "w+b") localFile.write(content) @@ -229,6 +222,29 @@ class AnteoLoader: self.torrentFile = torrentFile return self.torrentFile + def makeRequest(self, torrentUrl): + torrentUrl = re.sub('^://', 'http://', torrentUrl) + x = re.search("://(.+?)/|://(.+?)$", torrentUrl) + if x: + baseurl = x.group(1) if x.group(1) else x.group(2) + else: + baseurl ='' + + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://%s/' % baseurl), ('Accept-encoding', 'gzip'), ] + + opener = urllib2.build_opener() + opener.addheaders = headers + result = opener.open(torrentUrl) + if result.info().get('Content-Encoding') == 'gzip': + buf = StringIO(result.read()) + decomp = zlib.decompressobj(16 + zlib.MAX_WBITS) + content = decomp.decompress(buf.getvalue()) + else: + content = result.read() + return content + def md5(self, string): hasher = hashlib.md5() try: diff --git a/Inposloader.py b/Inposloader.py index 0408aac..6e754ff 100644 --- a/Inposloader.py +++ b/Inposloader.py @@ -168,20 +168,12 @@ class InposLoader: if not xbmcvfs.exists(self.torrentFilesPath): xbmcvfs.mkdirs(self.torrentFilesPath) torrentFile = localize_path(os.path.join(self.torrentFilesPath, self.md5(torrentUrl) + '.torrent')) try: - if not re.match("^http\:.+$", torrentUrl): + if not re.match("^[htps]+?://.+$|^://.+$", torrentUrl): + log('xbmcvfs.File for %s' % torrentUrl) content = xbmcvfs.File(torrentUrl, "rb").read() else: - request = urllib2.Request(torrentUrl) - request.add_header('Referer', torrentUrl) - request.add_header('Accept-encoding', 'gzip') - result = urllib2.urlopen(request) - if result.info().get('Content-Encoding') == 'gzip': - buf = StringIO(result.read()) - decomp = zlib.decompressobj(16 + zlib.MAX_WBITS) - content = decomp.decompress(buf.getvalue()) - else: - content = result.read() - + log('request for %s' % torrentUrl) + content = self.makeRequest(torrentUrl) localFile = xbmcvfs.File(torrentFile, "w+b") localFile.write(content) localFile.close() @@ -197,6 +189,29 @@ class InposLoader: self.torrentFile = torrentFile return self.torrentFile + def makeRequest(self, torrentUrl): + torrentUrl = re.sub('^://', 'http://', torrentUrl) + x = re.search("://(.+?)/|://(.+?)$", torrentUrl) + if x: + baseurl = x.group(1) if x.group(1) else x.group(2) + else: + baseurl ='' + + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://%s/' % baseurl), ('Accept-encoding', 'gzip'), ] + + opener = urllib2.build_opener() + opener.addheaders = headers + result = opener.open(torrentUrl) + if result.info().get('Content-Encoding') == 'gzip': + buf = StringIO(result.read()) + decomp = zlib.decompressobj(16 + zlib.MAX_WBITS) + content = decomp.decompress(buf.getvalue()) + else: + content = result.read() + return content + def md5(self, string): hasher = hashlib.md5() try: diff --git a/SkorbaLoader.py b/SkorbaLoader.py index fb0cdd7..34048c5 100644 --- a/SkorbaLoader.py +++ b/SkorbaLoader.py @@ -95,21 +95,12 @@ class SkorbaLoader: xbmcvfs.mkdirs(self.torrentFilesPath) torrentFile = localize_path(os.path.join(self.torrentFilesPath, self.md5(torrentUrl) + '.torrent')) try: - if not re.match("^http\:.+$", torrentUrl): - contentFile = xbmcvfs.File(torrentUrl, "rb") - content = contentFile.read() - contentFile.close() + if not re.match("^[htps]+?://.+$|^://.+$", torrentUrl): + log('xbmcvfs.File for %s' % torrentUrl) + content = xbmcvfs.File(torrentUrl, "rb").read() else: - request = urllib2.Request(torrentUrl) - request.add_header('Referer', torrentUrl) - request.add_header('Accept-encoding', 'gzip') - result = urllib2.urlopen(request) - if result.info().get('Content-Encoding') == 'gzip': - buf = StringIO(result.read()) - decomp = zlib.decompressobj(16 + zlib.MAX_WBITS) - content = decomp.decompress(buf.getvalue()) - else: - content = result.read() + log('request for %s' % torrentUrl) + content = self.makeRequest(torrentUrl) localFile = xbmcvfs.File(torrentFile, "w+b") localFile.write(content) @@ -144,7 +135,30 @@ class SkorbaLoader: self.torrentFileInfo = self.lt.torrent_info(e) self.torrentFile = torrentFile return self.torrentFile - + + def makeRequest(self, torrentUrl): + torrentUrl = re.sub('^://', 'http://', torrentUrl) + x = re.search("://(.+?)/|://(.+?)$", torrentUrl) + if x: + baseurl = x.group(1) if x.group(1) else x.group(2) + else: + baseurl ='' + + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://%s/' % baseurl), ('Accept-encoding', 'gzip'), ] + + opener = urllib2.build_opener() + opener.addheaders = headers + result = opener.open(torrentUrl) + if result.info().get('Content-Encoding') == 'gzip': + buf = StringIO(result.read()) + decomp = zlib.decompressobj(16 + zlib.MAX_WBITS) + content = decomp.decompress(buf.getvalue()) + else: + content = result.read() + return content + def getMagnetInfo(self): magnetSettings = { 'url': self.magnetLink, From c796a03661bd896f76e1076c35d3b85df024314e Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Wed, 14 Dec 2016 20:42:07 +0300 Subject: [PATCH 058/126] failed experement --- Core.py | 3 ++- Inposloader.py | 2 ++ SkorbaLoader.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Core.py b/Core.py index 87afe7d..8c21717 100644 --- a/Core.py +++ b/Core.py @@ -1491,7 +1491,8 @@ class Core: self.__settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) if fileIndex==None: fileIndex = chooseFile(torrent.getContentList()) if fileIndex: - xbmc.executebuiltin('xbmc.RunPlugin("plugin://plugin.video.torrenter/?action=playTorrent&url='+fileIndex+'")') + self.playTorrent({'url': fileIndex}) + #xbmc.executebuiltin('xbmc.RunPlugin("plugin://plugin.video.torrenter/?action=playTorrent&url='+fileIndex+'")') def openTorrent(self, params={}): get = params.get diff --git a/Inposloader.py b/Inposloader.py index 6e754ff..ab62122 100644 --- a/Inposloader.py +++ b/Inposloader.py @@ -28,6 +28,7 @@ import xbmc import xbmcgui import xbmcvfs import xbmcaddon +import xbmcplugin import Localization from functions import encode_msg, isSubtitle, is_writable, file_url, localize_path @@ -500,6 +501,7 @@ class InposPlayer(xbmc.Player): player = xbmc.Player() player.play(url, listitem) + #xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, listitem) xbmc.sleep(2000) # very important, do not edit this, podavan i = 0 diff --git a/SkorbaLoader.py b/SkorbaLoader.py index 34048c5..cd316db 100644 --- a/SkorbaLoader.py +++ b/SkorbaLoader.py @@ -54,7 +54,7 @@ class SkorbaLoader: if not is_writable(self.storageDirectory): xbmcgui.Dialog().ok(Localization.localize('Torrenter v2'), Localization.localize('Your storage path is not writable or not local! Please change it in settings!'), - Localization.localize(self.storageDirectory)) + self.storageDirectory) sys.exit(1) From cb6883c3f0d2619fff9c2e98b0ba1b83f0827423 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Thu, 15 Dec 2016 00:24:21 +0300 Subject: [PATCH 059/126] navigation draft --- Core.py | 2 +- Localization.py | 1 + searchwindow.py | 184 +++++++++++++++++++++++++++++++----------------- 3 files changed, 120 insertions(+), 67 deletions(-) diff --git a/Core.py b/Core.py index 8c21717..68e8b1d 100644 --- a/Core.py +++ b/Core.py @@ -1608,7 +1608,7 @@ class Core: def searchWindow(self, params={}): import searchwindow - searchwindow.main(params) + searchwindow.main() def showFilesList(self, filesList, params={}): get = params.get diff --git a/Localization.py b/Localization.py index 8fd714b..556bf15 100644 --- a/Localization.py +++ b/Localization.py @@ -809,6 +809,7 @@ def localize(text): 'Play (from start)':'Lejátszás (az elejétől)', }, 'ru': { + 'Torrenter Search Window': 'Окно Поиска Torrenter', 'Cancel': 'Отмена', 'Clear History': 'Очистить Историю', 'Play (with seek)': 'Играть (перемотка)', diff --git a/searchwindow.py b/searchwindow.py index 4a0522e..0f34eb5 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -46,32 +46,39 @@ class SearchWindow(pyxbmct.AddonDialogWindow): contentList = [] searchersList = [] addtime = None - right_buttons_count = 6 + right_buttons_count = 7 last_right_buttons_count = 0 last_link = None last_query = None - last_action = None last_top_button = None last_right_button = None last_listing_mode = None count = 0 + navi = { + 'last_top_button' : 4, + 'last_right_button' : 1, + 'right_menu' : [], + 'top_menu' : [], + 'route':[{'mode':'close', 'params':{}, 'last_listing_item': 0}] + } icon = __root__ + '/icons/searchwindow/%s.png' icon_tc = __root__ + '/icons/searchwindow/%s' + getTorrentClientIcon() - def __init__(self, title="", s_param={}): - super(SearchWindow, self).__init__(title) + def __init__(self, params = None): + super(SearchWindow, self).__init__(self.localize('Torrenter Search Window')) self.setGeometry(1280, 720, 9, 16) self.set_controls() self.connect_controls() - if s_param: - self.search(s_param=s_param) + if params: + self.search(params) else: - if __settings__.getSetting('debug') == 'true': - #self.downloadstatus() - self.watched() - else: - self.history() + self.history() + + if self.listing.size(): + self.setFocus(self.listing) + else: + self.setFocus(self.input_search) def set_controls(self): if not __settings__.getSetting('debug') == 'true': @@ -112,6 +119,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): _itemTextYOffset=0, _itemHeight=60, _space=0, _alignmentY=4) self.placeControl(self.listing, 1, 0, 8, 14) + self.navi['top_menu'] = [self.button_downloadstatus, self.button_torrentclient, self.button_keyboard, + self.input_search, self.button_search, self.button_history, self.button_watched, + self.button_controlcenter] + # Right menu self.right_menu() @@ -124,21 +135,21 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.connect(self.button_downloadstatus, self.downloadstatus) self.connect(self.button_watched, self.watched) - self.connect(pyxbmct.ACTION_NAV_BACK, self.close) + self.connect(pyxbmct.ACTION_NAV_BACK, self.navi_back) + self.connect(pyxbmct.ACTION_PREVIOUS_MENU, self.navi_back) + self.connect(pyxbmct.ACTION_PREVIOUS_MENU, self.close) self.connect(ACTION_MOUSE_RIGHT_CLICK, self.context) self.connect(ACTION_CONTEXT_MENU, self.context) self.connect(ACTION_SHOW_OSD, self.context) - self.connect(pyxbmct.ACTION_MOVE_LEFT, self.right_menu_set_label) - self.connect(pyxbmct.ACTION_MOVE_RIGHT, self.right_menu_set_label) - self.connect(pyxbmct.ACTION_MOVE_UP, self.right_menu_set_label) - self.connect(pyxbmct.ACTION_MOVE_DOWN, self.right_menu_set_label) + self.connect(pyxbmct.ACTION_MOVE_LEFT, self.navi_update) + self.connect(pyxbmct.ACTION_MOVE_RIGHT, self.navi_update) + self.connect(pyxbmct.ACTION_MOVE_UP, self.navi_update) + self.connect(pyxbmct.ACTION_MOVE_DOWN, self.navi_update) def set_navigation(self): # Top menu - self.button_downloadstatus.setNavigation(self.listing, self.listing, self.last_right_button, - self.button_torrentclient) self.button_torrentclient.setNavigation(self.listing, self.listing, self.button_downloadstatus, self.button_keyboard) self.button_keyboard.setNavigation(self.listing, self.listing, self.button_torrentclient, self.input_search) @@ -146,47 +157,102 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.button_search.setNavigation(self.listing, self.listing, self.input_search, self.button_history) self.button_history.setNavigation(self.listing, self.listing, self.button_search, self.button_watched) self.button_watched.setNavigation(self.listing, self.listing, self.button_history, self.button_controlcenter) + + self.update_navigation() + + def update_navigation(self): + self.last_top_button = self.navi['top_menu'][self.navi['last_top_button'] - 1] + self.last_right_button = self.navi['right_menu'][self.navi['last_right_button'] - 1] + + # Top menu + self.button_downloadstatus.setNavigation(self.listing, self.listing, self.last_right_button, + self.button_torrentclient) self.button_controlcenter.setNavigation(self.listing, self.listing, self.button_watched, self.last_right_button) # Main - self.listing.setNavigation(self.input_search, self.input_search, self.button_downloadstatus, + self.listing.setNavigation(self.last_top_button, self.input_search, self.button_downloadstatus, self.last_right_button) - if self.listing.size(): - self.setFocus(self.listing) - else: - self.setFocus(self.input_search) - def setAnimation(self, control): # Set fade animation for all add-on window controls control.setAnimations([('WindowOpen', 'effect=fade start=0 end=100 time=500',), ('WindowClose', 'effect=fade start=100 end=0 time=500',)]) - def search(self, addtime=None, s_param={}): - self.reconnect(pyxbmct.ACTION_NAV_BACK, self.history) - self.right_menu('search') + def navi_back(self): + log('navi_back init') + self.navi['route'].pop(-1) + route = self.navi['route'][-1] + action = getattr(self, route['mode']) + if route['params']: + action(route['params']) + else: + action() + self.setFocus(self.listing) + log('route[last_listing_item]: '+str(route['last_listing_item'])) + if route['last_listing_item'] > 0: + self.listing.selectItem(route['last_listing_item']) + + def navi_update(self): + log('navi_update init') + focused_control = self.getFocus() + debug('start navi_update' + str(focused_control)) + log(str(self.navi['route'])) + + if focused_control == self.listing: + item_index = self.listing.getSelectedPosition() + self.navi['route'][-1]['last_listing_item'] = item_index + debug('self.listing getSelectedPosition ' + str(item_index)) + + item = self.listing.getSelectedItem() + params = json.loads(item.getfilename()) + mode = params.get('mode') + log('navi_update:' + str(mode)) + if self.last_listing_mode != mode: + self.last_listing_mode = mode + debug('set_menulist navi_update:' + str(mode)) + self.set_menulist(mode) + + elif self.getFocus() in self.navi['top_menu']: + self.navi['last_top_button'] = self.navi['top_menu'].index(focused_control) + 1 + self.update_navigation() + + elif self.getFocus() in self.navi['right_menu']: + self.navi['last_right_button'] = self.navi['right_menu'].index(focused_control) + 1 + self.update_navigation() + + def navi_route(self, mode, params = None, last_listing_item = 0): + self.navi['route'].append({'mode': mode, + 'params': {} if not params else params, + 'last_listing_item': last_listing_item}) + self.right_menu(mode) self.listing.reset() - if s_param: - if s_param.get('url'): - search = urllib.unquote_plus(s_param.get('url')) - external = s_param.get("return_name") + + def search(self, params = None): + self.navi_route('search', params) + + get = params.get + addtime = get('addtime') + query = None + + if params: + if get('url'): + search = urllib.unquote_plus(get('url')) + external = get("return_name") if external: searcher = 'landing from : %s ' % str(external) else: searcher = '' self.setWindowTitle(title='%s %s' % ('Torrenter Search Window', searcher)) - if s_param.get('showKey') == 'true': + if get('showKey') == 'true': self.input_search.setText(search) - query = self.input_search.getText() + self.setFocus(self.input_search) + return else: self.input_search.setText(search) query = search # self.setFocus(self.listing) else: query = self.input_search.getText() - self.history() - else: - query = self.input_search.getText() log('Search query: ' + str(query)) if not addtime and query == self.last_query: @@ -207,12 +273,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): for (order, seeds, leechers, size, title, link, image) in self.filesList: title = titleMake(seeds, leechers, size, title) self.drawItem(title, {'mode': 'search_item', 'filename': link}, image) - self.setFocus(self.listing) + self.setFocus(self.listing) - def history(self): - self.right_menu('history') - self.listing.reset() - self.reconnect(pyxbmct.ACTION_NAV_BACK, self.close) + def history(self, params = None): + self.navi_route('history') db = HistoryDB() items = db.get_all() @@ -251,14 +315,12 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def watched(self): self.right_menu('watched') self.listing.reset() - self.reconnect(pyxbmct.ACTION_NAV_BACK, self.history) db = WatchedHistoryDB() items = db.get_all() log('[WatchedHistory]: items - '+str(items)) if items: - ListString = 'XBMC.RunPlugin(%s)' % (sys.argv[0] + '?action=%s&action2=%s&%s=%s') for addtime, filename, foldername, path, url, seek, length, ind, size in items: seek = int(seek) if int(seek) > 3*60 else 0 watchedPercent = int((float(seek) / float(length)) * 100) @@ -279,7 +341,6 @@ class SearchWindow(pyxbmct.AddonDialogWindow): link = {'mode': 'watched_item', 'addtime': str(addtime)} self.drawItem(title, link, image=img) - def watched_action(self, action, addtime): db = WatchedHistoryDB() @@ -290,7 +351,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if action == 'open': filename, foldername, path, url, seek, length, ind = db.get('filename, foldername, path, url, seek, length, ind', 'addtime', str(addtime)) - self.reconnect(pyxbmct.ACTION_NAV_BACK, self.watched) + #self.reconnect(pyxbmct.ACTION_NAV_BACK, self.watched) self.open_torrent(path.encode('utf-8')) if action == 'playnoseek' or action == 'playwithseek': @@ -327,7 +388,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if not hash: self.right_menu('browser') - self.reconnect(pyxbmct.ACTION_NAV_BACK, self.history) + #self.reconnect(pyxbmct.ACTION_NAV_BACK, self.history) for data in DownloadList: status = " " img = '' @@ -350,7 +411,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): {"title": title, "image": img, "argv": {'mode': 'browser_item', 'hash': str(data['id'])}}) elif not tdir: self.right_menu('browser_subfolder') - self.reconnect(pyxbmct.ACTION_NAV_BACK, self.browser) + #self.reconnect(pyxbmct.ACTION_NAV_BACK, self.browser) self.drawItem('..', {'mode': 'browser_moveup'}, isFolder=True) dllist = sorted(Download().listfiles(hash), key=lambda x: x[0]) for name, percent, ind, size in dllist: @@ -482,7 +543,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def downloadstatus(self): self.listing.reset() self.right_menu('downloadstatus') - self.reconnect(pyxbmct.ACTION_NAV_BACK, self.history) + #self.reconnect(pyxbmct.ACTION_NAV_BACK, self.history) db = DownloadDB() items = db.get_all() @@ -615,7 +676,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.close() else: self.right_menu('file_browser') - self.reconnect(pyxbmct.ACTION_NAV_BACK, self.downloadstatus) + #self.reconnect(pyxbmct.ACTION_NAV_BACK, self.downloadstatus) self.drawItem('..', {'mode': 'moveup', 'path': path, 'tdir': os.path.dirname(tdir)}, isFolder=True) @@ -733,6 +794,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.removeControls(remove_list) label_list = self.get_menulist(mode) + self.navi['right_menu'] = [] self.right_buttons_count = len(label_list) button_num_list = range(1, self.right_buttons_count + 1) @@ -744,9 +806,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.placeControl(button, index, 14, 1, 2) # Navigation - self.last_right_button = self.button_right1 + self.navi['last_right_button'] = 1 for index in button_num_list: button = getattr(self, "button_right" + str(index)) + self.navi['right_menu'].append(button) if self.right_buttons_count == 1: button.setNavigation(self.button_controlcenter, @@ -768,18 +831,6 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.set_menulist(mode) self.set_navigation() - def right_menu_set_label(self): - debug('start right_menu_set_label' + str(self.getFocus())) - if self.getFocus() == self.listing: - item = self.listing.getSelectedItem() - params = json.loads(item.getfilename()) - mode = params.get('mode') - debug('right_menu_set_label:' + str(mode)) - if self.last_listing_mode != mode: - self.last_listing_mode = mode - debug('set_menulist right_menu_set_label:' + str(mode)) - self.set_menulist(mode) - def set_menulist(self, mode): self.count += 1 label_list = self.get_menulist(mode) @@ -840,7 +891,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): tdir = params.get('tdir') self.listing.reset() if mode in ['search_item', 'torrent_subfolder']: - self.reconnect(pyxbmct.ACTION_NAV_BACK, self.search) + #self.reconnect(pyxbmct.ACTION_NAV_BACK, self.search) self.open_torrent(filename, tdir) elif mode == 'torrent_moveup': self.search() @@ -852,7 +903,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): elif mode == 'history_search_item': addtime = params.get('addtime') self.input_search.setText(filename) - self.search(addtime) + params = {'addtime': addtime} + self.search(params) elif mode in ['browser_item', 'browser_subfolder', 'browser_moveup']: self.browser(hash, tdir) elif mode == 'browser_file': @@ -1118,8 +1170,8 @@ def dlstat_titleMake(title, second): return title -def main(params={}): - dialog = SearchWindow("Torrenter Search Window", params) +def main(params = None): + dialog = SearchWindow(params) dialog.doModal() del dialog # You need to delete your instance when it is no longer needed # because underlying xbmcgui classes are not grabage-collected. From 87e80dda3f661d6217f5dc2ee34c8834f074bff7 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Thu, 15 Dec 2016 21:05:49 +0300 Subject: [PATCH 060/126] navigation fix --- searchwindow.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index 0f34eb5..c66d242 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -221,9 +221,17 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.update_navigation() def navi_route(self, mode, params = None, last_listing_item = 0): - self.navi['route'].append({'mode': mode, - 'params': {} if not params else params, - 'last_listing_item': last_listing_item}) + log('navi_route init') + if not params or not params.get('back'): + log('***** self.navi[\'route\'].append *****' + str(mode) + str(params) + str(last_listing_item)) + if not params: + params = {'back': True} + else: + params['back'] = True + + self.navi['route'].append({'mode': mode, + 'params': params, + 'last_listing_item': last_listing_item}) self.right_menu(mode) self.listing.reset() @@ -268,19 +276,20 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.last_query = query elif len(query) == 0: self.filesList = [] - if 1 == 1: - if self.filesList: - for (order, seeds, leechers, size, title, link, image) in self.filesList: - title = titleMake(seeds, leechers, size, title) - self.drawItem(title, {'mode': 'search_item', 'filename': link}, image) - self.setFocus(self.listing) + + if self.filesList: + for (order, seeds, leechers, size, title, link, image) in self.filesList: + title = titleMake(seeds, leechers, size, title) + self.drawItem(title, {'mode': 'search_item', 'filename': link}, image) + self.setFocus(self.listing) def history(self, params = None): - self.navi_route('history') + self.navi_route('history', params) db = HistoryDB() items = db.get_all() favlist = [(1, '[B]%s[/B]'), (0, '%s')] + last_listing_item = 0 if items: for favbool, bbstring in favlist: for addtime, string, fav in items: @@ -289,12 +298,14 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if int(fav) == 1: img = __root__ + '/icons/fav.png' + last_listing_item += 1 else: img = __root__ + '/icons/unfav.png' link = {'mode': 'history_search_item', 'filename': title, 'addtime': str(addtime), 'fav': str(fav)} self.drawItem(bbstring % title, link, img) + self.navi['route'][-1]['last_listing_item'] = last_listing_item def history_action(self, action, addtime, fav): db = HistoryDB() From 6d7a8945cc5e14c478a5db918be718f3db080b03 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Thu, 15 Dec 2016 22:05:11 +0300 Subject: [PATCH 061/126] right menu revolution --- searchwindow.py | 288 ++++++++++++++++++++++-------------------------- 1 file changed, 129 insertions(+), 159 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index c66d242..beec13d 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -302,7 +302,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): else: img = __root__ + '/icons/unfav.png' - link = {'mode': 'history_search_item', 'filename': title, 'addtime': str(addtime), + link = {'mode': 'history_item', 'query': title, 'addtime': str(addtime), 'fav': str(fav)} self.drawItem(bbstring % title, link, img) self.navi['route'][-1]['last_listing_item'] = last_listing_item @@ -362,8 +362,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if action == 'open': filename, foldername, path, url, seek, length, ind = db.get('filename, foldername, path, url, seek, length, ind', 'addtime', str(addtime)) - #self.reconnect(pyxbmct.ACTION_NAV_BACK, self.watched) - self.open_torrent(path.encode('utf-8')) + params = {'link': path.encode('utf-8')} + self.open_torrent(params) if action == 'playnoseek' or action == 'playwithseek': filename, path, url, seek, length, ind = db.get('filename, path, url, seek, length, ind', 'addtime', str(addtime)) @@ -707,7 +707,13 @@ class SearchWindow(pyxbmct.AddonDialogWindow): else: self.setFocus(self.button_downloadstatus) - def open_torrent(self, link, tdir=None): + def open_torrent(self, params): + self.navi_route('open_torrent', params) + # def open_torrent(self, link, tdir=None): + get = params.get + link = get('link') + tdir = get('tdir') + # cache if link != self.last_link: self.contentList = get_contentList(link) @@ -741,7 +747,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): label_list = ["Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty"] - if mode in ['search', 'search_item', 'torrent_play']: + if mode in ['search', 'search_item', 'torrent_play', 'open_torrent']: label_list = [self.localize('Open'), self.localize('Download via T-client'), self.localize('Download via Libtorrent'), @@ -751,7 +757,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): label_list = [self.localize('Open'),] elif mode in ['file']: label_list = [self.localize('Play'), ] - elif mode in ['history', 'history_search_item']: + elif mode in ['history', 'history_item']: label_list = [self.localize('Open'), self.localize('Edit'), self.localize('Individual Tracker Options'), @@ -892,177 +898,141 @@ class SearchWindow(pyxbmct.AddonDialogWindow): button.setLabel(label) def right_press1(self): + self.right_press(1) + + def right_press2(self): + self.right_press(2) + + def right_press3(self): + self.right_press(3) + + def right_press4(self): + self.right_press(4) + + def right_press5(self): + self.right_press(5) + + def right_press6(self): + self.right_press(6) + + def right_press7(self): + self.right_press(7) + + def right_press(self, index): item = self.listing.getSelectedItem() params = json.loads(item.getfilename()) - log('params ' + str(params)) + log('right_press %d params %s' % (index, str(params))) mode = params.get('mode') filename = params.get('filename') hash = params.get('hash') ind = params.get('ind') tdir = params.get('tdir') - self.listing.reset() + action = None + if mode in ['search_item', 'torrent_subfolder']: - #self.reconnect(pyxbmct.ACTION_NAV_BACK, self.search) - self.open_torrent(filename, tdir) + if index == 1: + params = {'link': filename, 'tdir': tdir} + self.open_torrent(params) + elif index == 2: + action = 'downloadFilesList' + link = {'url': filename} + url = self.form_link(action, link) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + elif index == 3: + action = 'downloadLibtorrent' + link = {'url': filename} + url = self.form_link(action, link) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + elif index == 4: #search_item + cleanlabel = re.sub('\[[^\]]*\]', '', item.getLabel()) + ttl, yr = xbmc.getCleanMovieTitle(cleanlabel) + infoW = InfoWindow(ttl, yr) + infoW.doModal() + del infoW elif mode == 'torrent_moveup': - self.search() - self.setFocus(self.listing) + if index == 1: + self.search() + self.setFocus(self.listing) elif mode == 'torrent_play': - url = self.form_link('playTorrent', params) - xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) - self.close() - elif mode == 'history_search_item': + if index == 1: + url = self.form_link('playTorrent', params) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + self.close() + elif index == 2: + action = 'downloadFilesList' + link = {'ind': str(params.get('url'))} + url = self.form_link(action, link) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + elif index == 3: + action = 'downloadLibtorrent' + link = {'ind': str(params.get('url'))} + url = self.form_link(action, link) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + elif mode == 'history_item': addtime = params.get('addtime') - self.input_search.setText(filename) - params = {'addtime': addtime} - self.search(params) + fav = params.get('fav') + query = params.get('query') + if index == 1: + self.input_search.setText(query) + self.search({'addtime': addtime}) + elif index == 2: + self.input_search.setText(query) + self.setFocus(self.input_search) + elif index == 3: + params['title'] = params.get('query') + self.controlCenter(params) + else: + if index == 4: action = 'fav' + elif index == 5: action = 'delete' + self.history_action(action, addtime, fav) elif mode in ['browser_item', 'browser_subfolder', 'browser_moveup']: - self.browser(hash, tdir) + if index == 1: + self.browser(hash, tdir) + elif index in [2, 3, 4] and mode =='browser_subfolder': + if index == 2: action = '3' + elif index == 3: action = '0' + elif index == 4: action = 'copy' + + self.browser_action(hash, action, tdir=tdir, ind=ind) + else: + if index == 2: action = 'start' + elif index == 3: action = 'stop' + elif index == 4: action = 'remove' + elif index == 5: action = '3' + elif index == 6: action = '0' + elif index == 7: action = 'removedata' + + self.browser_action(hash, action) + + if index in [4, 7]: + self.browser() elif mode == 'browser_file': - self.browser_action(hash, 'play', tdir = tdir, ind = ind) - self.close() + if index == 1: action = 'play' + elif index == 2: action = '3' + elif index == 3: action = '0' + + self.browser_action(hash, action, tdir = tdir, ind = ind) + + if index == 1: + self.close() elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: - self.downloadstatus_action('play', params.get('addtime'), params.get('path'), + if index == 1: action = 'play' + elif index == 2: action = 'start' + elif index == 3: action = 'pause' + elif index == 4: action = 'stop' + elif index == 5: action = 'delete' + elif index == 6: action = 'masscontrol' + self.downloadstatus_action(action, params.get('addtime'), params.get('path'), params.get('type'), params.get('progress'), params.get('storage')) elif mode in ['moveup', 'subfolder', 'file']: self.file_browser(params.get('type'), params.get('path'), tdir) elif mode == 'watched_item': - self.watched_action('open', params.get('addtime')) - - def right_press2(self): - item = self.listing.getSelectedItem() - params = json.loads(item.getfilename()) - mode = params.get('mode') - filename = params.get('filename') - hash = params.get('hash') - ind = params.get('ind') - tdir = params.get('tdir') - if mode == 'torrent_play': - action = 'downloadFilesList' - link = {'ind': str(params.get('url'))} - url = self.form_link(action, link) - xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) - elif mode == 'search_item': - action = 'downloadFilesList' - link = {'url': filename} - url = self.form_link(action, link) - xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) - elif mode == 'history_search_item': - self.input_search.setText(filename) - self.setFocus(self.input_search) - elif mode == 'browser_item': - self.browser_action(hash, 'start') - elif mode == 'browser_subfolder': - self.browser_action(hash, '3', tdir=tdir, ind=ind) - elif mode == 'browser_file': - self.browser_action(hash, '3', tdir=tdir, ind=ind) - elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: - self.downloadstatus_action('start', params.get('addtime'), params.get('path'), - params.get('type'), params.get('progress'), params.get('storage')) - elif mode == 'watched_item': - self.watched_action('playnoseek', params.get('addtime')) - - def right_press3(self): - item = self.listing.getSelectedItem() - params = json.loads(item.getfilename()) - mode = params.get('mode') - filename = params.get('filename') - hash = params.get('hash') - ind = params.get('ind') - tdir = params.get('tdir') - if mode == 'torrent_play': - action = 'downloadLibtorrent' - link = {'ind': str(params.get('url'))} - url = self.form_link(action, link) - xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) - elif mode == 'search_item': - action = 'downloadLibtorrent' - link = {'url': filename} - url = self.form_link(action, link) - xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) - elif mode == 'history_search_item': - params['title'] = params.get('filename') - self.controlCenter(params) - elif mode == 'browser_item': - self.browser_action(hash, 'stop') - elif mode == 'browser_subfolder': - self.browser_action(hash, '0', tdir=tdir, ind=ind) - elif mode == 'browser_file': - self.browser_action(hash, '0', tdir=tdir, ind=ind) - elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: - self.downloadstatus_action('pause', params.get('addtime'), params.get('path'), - params.get('type'), params.get('progress'), params.get('storage')) - elif mode == 'watched_item': - self.watched_action('playwithseek', params.get('addtime')) - - def right_press4(self): - item = self.listing.getSelectedItem() - params = json.loads(item.getfilename()) - mode = params.get('mode') - filename = params.get('filename') - hash = params.get('hash') - ind = params.get('ind') - tdir = params.get('tdir') - if mode == 'history_search_item': - addtime = params.get('addtime') - fav = params.get('fav') - self.history_action('fav', addtime, fav) - elif mode == 'search_item': - cleanlabel = re.sub('\[[^\]]*\]', '', item.getLabel()) - ttl, yr = xbmc.getCleanMovieTitle(cleanlabel) - infoW = InfoWindow(ttl, yr) - infoW.doModal() - del infoW - elif mode == 'browser_item': - self.browser_action(hash, 'remove') - self.browser() - elif mode == 'browser_subfolder': - self.browser_action(hash, 'copy', tdir=tdir, ind=ind) - elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: - self.downloadstatus_action('stop', params.get('addtime'), params.get('path'), - params.get('type'), params.get('progress'), params.get('storage')) - elif mode == 'watched_item': - self.watched_action('delete', params.get('addtime')) - - def right_press5(self): - item = self.listing.getSelectedItem() - params = json.loads(item.getfilename()) - mode = params.get('mode') - filename = params.get('filename') - hash = params.get('hash') - if mode == 'history_search_item': - addtime = params.get('addtime') - fav = params.get('fav') - self.history_action('delete', addtime, fav) - elif mode == 'browser_item': - self.browser_action(hash, '3') - elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: - self.downloadstatus_action('delete', params.get('addtime'), params.get('path'), - params.get('type'), params.get('progress'), params.get('storage')) - elif mode == 'watched_item': - self.watched_action('clear', params.get('addtime')) - - def right_press6(self): - item = self.listing.getSelectedItem() - params = json.loads(item.getfilename()) - mode = params.get('mode') - filename = params.get('filename') - hash = params.get('hash') - if mode == 'browser_item': - self.browser_action(hash, '0') - elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: - self.downloadstatus_action('masscontrol', params.get('addtime'), params.get('path'), - params.get('type'), params.get('progress'), params.get('storage')) - - def right_press7(self): - item = self.listing.getSelectedItem() - params = json.loads(item.getfilename()) - mode = params.get('mode') - filename = params.get('filename') - hash = params.get('hash') - if mode == 'browser_item': - self.browser_action(hash, 'removedata') - self.browser() + if index == 1: action = 'open' + elif index == 2: action = 'playnoseek' + elif index == 3: action = 'playwithseek' + elif index == 4: action = 'delete' + elif index == 5: action = 'clear' + self.watched_action(action, params.get('addtime')) def localize(self, string): try: From 032fca5f95482c9431abe8ec1c7294712385dda3 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Thu, 15 Dec 2016 23:50:35 +0300 Subject: [PATCH 062/126] Movie Info During Playback --- Anteoloader.py | 4 ++++ Core.py | 4 ++-- Inposloader.py | 5 ++++- Player.py | 8 ++++---- functions.py | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 60 insertions(+), 8 deletions(-) diff --git a/Anteoloader.py b/Anteoloader.py index 3ec1105..615cad5 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -519,6 +519,10 @@ class AnteoPlayer(xbmc.Player): listitem.setThumbnailImage(urllib.unquote_plus(thumbnail)) self.display_name = label + if self.get('listitem'): + listitem = self.get('listitem') + listitem.setPath(url) + player = xbmc.Player() player.play(url, listitem) diff --git a/Core.py b/Core.py index 68e8b1d..9254033 100644 --- a/Core.py +++ b/Core.py @@ -1491,8 +1491,8 @@ class Core: self.__settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) if fileIndex==None: fileIndex = chooseFile(torrent.getContentList()) if fileIndex: - self.playTorrent({'url': fileIndex}) - #xbmc.executebuiltin('xbmc.RunPlugin("plugin://plugin.video.torrenter/?action=playTorrent&url='+fileIndex+'")') + item = get_item() + self.playTorrent({'url': fileIndex, 'listitem': item}) def openTorrent(self, params={}): get = params.get diff --git a/Inposloader.py b/Inposloader.py index ab62122..dcc530c 100644 --- a/Inposloader.py +++ b/Inposloader.py @@ -499,9 +499,12 @@ class InposPlayer(xbmc.Player): self.display_name = label log(self.display_name) + if self.get('listitem'): + listitem = self.get('listitem') + listitem.setPath(url) + player = xbmc.Player() player.play(url, listitem) - #xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, listitem) xbmc.sleep(2000) # very important, do not edit this, podavan i = 0 diff --git a/Player.py b/Player.py index 4376657..afc0323 100644 --- a/Player.py +++ b/Player.py @@ -338,12 +338,12 @@ class TorrentPlayer(xbmc.Player): response = json.loads(request) xbmc.sleep(1000) + if self.get('listitem'): + listitem = self.get('listitem') + listitem.setPath(path) + if response: xbmc.Player().play(path, listitem) - #playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) - #playlist.clear() - #playlist.add(path, listitem) - #xbmc.Player().play(playlist) xbmc.sleep(2000) # very important, do not edit this, podavan i = 0 diff --git a/functions.py b/functions.py index f48a290..7d39ccc 100644 --- a/functions.py +++ b/functions.py @@ -2202,4 +2202,49 @@ def getTorrentClientIcon(): elif client == '4': return 'qbittorrent.png' else: - return 'torrent-client.png' \ No newline at end of file + return 'torrent-client.png' + +def get_item(): + #some plugin.video.quasar magic + item = xbmcgui.ListItem( + path='', + label=xbmc.getInfoLabel("ListItem.Label"), + label2=xbmc.getInfoLabel("ListItem.label2"), + thumbnailImage=xbmc.getInfoLabel("ListItem.Art(thumb)")) + _infoLabels = { + "Title": xbmc.getInfoLabel("ListItem.Title"), + "OriginalTitle": xbmc.getInfoLabel("ListItem.OriginalTitle"), + "TVShowTitle": xbmc.getInfoLabel("ListItem.TVShowTitle"), + "Season": xbmc.getInfoLabel("ListItem.Season"), + "Episode": xbmc.getInfoLabel("ListItem.Episode"), + "Premiered": xbmc.getInfoLabel("ListItem.Premiered"), + "Plot": xbmc.getInfoLabel("ListItem.Plot"), + # "Date": xbmc.getInfoLabel("ListItem.Date"), + "VideoCodec": xbmc.getInfoLabel("ListItem.VideoCodec"), + "VideoResolution": xbmc.getInfoLabel("ListItem.VideoResolution"), + "VideoAspect": xbmc.getInfoLabel("ListItem.VideoAspect"), + "DBID": xbmc.getInfoLabel("ListItem.DBID"), + "DBTYPE": xbmc.getInfoLabel("ListItem.DBTYPE"), + "Writer": xbmc.getInfoLabel("ListItem.Writer"), + "Director": xbmc.getInfoLabel("ListItem.Director"), + "Rating": xbmc.getInfoLabel("ListItem.Rating"), + "Votes": xbmc.getInfoLabel("ListItem.Votes"), + "IMDBNumber": xbmc.getInfoLabel("ListItem.IMDBNumber"), + } + infoLabels = {} + for key, value in _infoLabels.iteritems(): + if value: + infoLabels[key] = value + + poster = xbmc.getInfoLabel("ListItem.Art(poster)") + if not poster: + poster = xbmc.getInfoLabel("ListItem.Art(tvshow.poster)") + + item.setArt({ + "poster": poster, + "banner": xbmc.getInfoLabel("ListItem.Art(banner)"), + "fanart": xbmc.getInfoLabel("ListItem.Art(fanart)") + }) + + item.setInfo(type='Video', infoLabels=infoLabels) + return item \ No newline at end of file From 2abf1d6e96925aa43277c55e5ab4fb102c7241ff Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Fri, 16 Dec 2016 17:50:07 +0300 Subject: [PATCH 063/126] ru title fix --- Anteoloader.py | 10 +++++----- Inposloader.py | 2 +- Player.py | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Anteoloader.py b/Anteoloader.py index 615cad5..e7e1fed 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -30,7 +30,7 @@ import xbmcgui import xbmcvfs import xbmcaddon import Localization -from functions import file_encode, isSubtitle, DownloadDB, log, debug, is_writable, unquote, file_url +from functions import localize_path, isSubtitle, DownloadDB, log, debug, is_writable, unquote, file_url import os @@ -620,10 +620,10 @@ class AnteoPlayer(xbmc.Player): def _get_status_lines(self, s, f): return [ - self.display_name, - "%.2f%% %s" % (f.progress * 100, self.localize(STATE_STRS[s.state]).decode('utf-8')), - "D:%.2f%s U:%.2f%s S:%d P:%d" % (s.download_rate, self.localize('kb/s').decode('utf-8'), - s.upload_rate, self.localize('kb/s').decode('utf-8'), + ensure_str(self.display_name), + "%.2f%% %s" % (f.progress * 100, self.localize(STATE_STRS[s.state])), + "D:%.2f%s U:%.2f%s S:%d P:%d" % (s.download_rate, self.localize('kb/s'), + s.upload_rate, self.localize('kb/s'), s.num_seeds, s.num_peers) ] diff --git a/Inposloader.py b/Inposloader.py index dcc530c..a07f919 100644 --- a/Inposloader.py +++ b/Inposloader.py @@ -607,7 +607,7 @@ class InposPlayer(xbmc.Player): def _get_status_lines(self, s, f): return [ - self.display_name.encode('utf-8'), + ensure_str(self.display_name), "%.2f%% %s" % (f.progress * 100, self.localize(STATE_STRS[s.state])), "D:%.2f%s U:%.2f%s S:%d P:%d" % (s.download_rate, self.localize('kb/s'), s.upload_rate, self.localize('kb/s'), diff --git a/Player.py b/Player.py index afc0323..62a3935 100644 --- a/Player.py +++ b/Player.py @@ -30,7 +30,7 @@ import Downloader import xbmcgui import xbmcvfs import Localization -from functions import calculate, showMessage, clearStorage, WatchedHistoryDB, DownloadDB, get_ids_video, log, debug, foldername +from functions import calculate, showMessage, clearStorage, WatchedHistoryDB, DownloadDB, get_ids_video, log, debug, foldername, ensure_str ROOT = sys.modules["__main__"].__root__ RESOURCES_PATH = os.path.join(ROOT, 'resources') @@ -465,10 +465,10 @@ class TorrentPlayer(xbmc.Player): def _get_status_lines(self, s): return [ - self.display_name+'; '+self.torrent.get_debug_info('dht_state'), - "%.2f%% %s; %s" % (s.progress * 100, self.localize(STATE_STRS[s.state]).decode('utf-8'), self.torrent.get_debug_info('trackers_sum')), - "D:%.2f%s U:%.2f%s S:%d P:%d" % (s.download_rate / 1024, self.localize('kb/s').decode('utf-8'), - s.upload_rate / 1024, self.localize('kb/s').decode('utf-8'), + ensure_str(self.display_name), + "%.2f%% %s" % (s.progress * 100, self.localize(STATE_STRS[s.state])), + "D:%.2f%s U:%.2f%s S:%d P:%d" % (s.download_rate / 1024, self.localize('kb/s'), + s.upload_rate / 1024, self.localize('kb/s'), s.num_seeds, s.num_peers) ] From 12fcb4bd64c52019f62fd1abc8375b8e90011dda Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Fri, 16 Dec 2016 20:17:10 +0300 Subject: [PATCH 064/126] navi --- Anteoloader.py | 2 +- Localization.py | 1 + functions.py | 2 +- searchwindow.py | 109 +++++++++++++++++++++++++++--------------------- 4 files changed, 64 insertions(+), 50 deletions(-) diff --git a/Anteoloader.py b/Anteoloader.py index e7e1fed..2638c94 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -134,7 +134,7 @@ class AnteoLoader: dht_routers = ["router.bittorrent.com:6881", "router.utorrent.com:6881"] user_agent = 'uTorrent/2200(24683)' - self.engine = Engine(uri=file_url(self.torrentFile), download_path=self.storageDirectory, + self.engine = Engine(uri=file_url(localize_path(self.torrentFile)), download_path=self.storageDirectory, connections_limit=connections_limit, encryption=encryption, keep_complete=keep_complete, keep_incomplete=keep_incomplete, dht_routers=dht_routers, use_random_port=use_random_port, listen_port=listen_port, diff --git a/Localization.py b/Localization.py index 556bf15..39a3b0a 100644 --- a/Localization.py +++ b/Localization.py @@ -809,6 +809,7 @@ def localize(text): 'Play (from start)':'Lejátszás (az elejétől)', }, 'ru': { + 'Move Up': 'Вверх', 'Torrenter Search Window': 'Окно Поиска Torrenter', 'Cancel': 'Отмена', 'Clear History': 'Очистить Историю', diff --git a/functions.py b/functions.py index 7d39ccc..7b4edd2 100644 --- a/functions.py +++ b/functions.py @@ -1352,7 +1352,7 @@ def get_contentList(url): url = Searchers().downloadWithSearcher(classMatch.group(2), searcher) __settings__.setSetting("lastTorrent", url) - torrent = Downloader.Torrent(userStorageDirectory, torrentFilesDirectory=torrentFilesDirectory) + torrent = Downloader.Torrent(userStorageDirectory, url, torrentFilesDirectory=torrentFilesDirectory) __settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) diff --git a/searchwindow.py b/searchwindow.py index beec13d..710eb5e 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -47,6 +47,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): searchersList = [] addtime = None right_buttons_count = 7 + right_label_count = 7 last_right_buttons_count = 0 last_link = None last_query = None @@ -92,10 +93,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): noFocusTexture=self.icon % 'nfdownloadstatus') self.placeControl(self.button_downloadstatus, 0, 1, 1, 1) - self.button_torrentclient = pyxbmct.Button("", + self.button_browser = pyxbmct.Button("", focusTexture=self.icon_tc % 'f', noFocusTexture=self.icon_tc % 'nf') - self.placeControl(self.button_torrentclient, 0, 2, 1, 1) + self.placeControl(self.button_browser, 0, 2, 1, 1) self.button_keyboard = pyxbmct.Button("", focusTexture=self.icon % 'fkeyboard', noFocusTexture=self.icon % 'nfkeyboard') self.placeControl(self.button_keyboard, 0, 3, 1, 1) @@ -119,7 +120,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): _itemTextYOffset=0, _itemHeight=60, _space=0, _alignmentY=4) self.placeControl(self.listing, 1, 0, 8, 14) - self.navi['top_menu'] = [self.button_downloadstatus, self.button_torrentclient, self.button_keyboard, + self.navi['top_menu'] = [self.button_downloadstatus, self.button_browser, self.button_keyboard, self.input_search, self.button_search, self.button_history, self.button_watched, self.button_controlcenter] @@ -130,8 +131,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.connect(self.listing, self.right_press1) self.connect(self.button_history, self.history) self.connect(self.button_search, self.search) - self.connect(self.button_controlcenter, self.controlCenter) - self.connect(self.button_torrentclient, self.browser) + self.connect(self.button_controlcenter, self.controlcenter) + self.connect(self.button_browser, self.browser) self.connect(self.button_downloadstatus, self.downloadstatus) self.connect(self.button_watched, self.watched) @@ -150,9 +151,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def set_navigation(self): # Top menu - self.button_torrentclient.setNavigation(self.listing, self.listing, self.button_downloadstatus, + self.button_browser.setNavigation(self.listing, self.listing, self.button_downloadstatus, self.button_keyboard) - self.button_keyboard.setNavigation(self.listing, self.listing, self.button_torrentclient, self.input_search) + self.button_keyboard.setNavigation(self.listing, self.listing, self.button_browser, self.input_search) self.input_search.setNavigation(self.listing, self.listing, self.button_keyboard, self.button_search) self.button_search.setNavigation(self.listing, self.listing, self.input_search, self.button_history) self.button_history.setNavigation(self.listing, self.listing, self.button_search, self.button_watched) @@ -162,11 +163,13 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def update_navigation(self): self.last_top_button = self.navi['top_menu'][self.navi['last_top_button'] - 1] + if self.navi['last_right_button'] > self.right_label_count: + self.navi['last_right_button'] = self.right_label_count self.last_right_button = self.navi['right_menu'][self.navi['last_right_button'] - 1] # Top menu self.button_downloadstatus.setNavigation(self.listing, self.listing, self.last_right_button, - self.button_torrentclient) + self.button_browser) self.button_controlcenter.setNavigation(self.listing, self.listing, self.button_watched, self.last_right_button) # Main @@ -194,7 +197,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def navi_update(self): log('navi_update init') - focused_control = self.getFocus() + try: + focused_control = self.getFocus() + except: + focused_control = None debug('start navi_update' + str(focused_control)) log(str(self.navi['route'])) @@ -211,18 +217,27 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.last_listing_mode = mode debug('set_menulist navi_update:' + str(mode)) self.set_menulist(mode) + self.update_navigation() - elif self.getFocus() in self.navi['top_menu']: + elif focused_control in self.navi['top_menu']: self.navi['last_top_button'] = self.navi['top_menu'].index(focused_control) + 1 self.update_navigation() - elif self.getFocus() in self.navi['right_menu']: + elif focused_control in self.navi['right_menu']: self.navi['last_right_button'] = self.navi['right_menu'].index(focused_control) + 1 self.update_navigation() - def navi_route(self, mode, params = None, last_listing_item = 0): + def navi_route(self, mode, params = {}, last_listing_item = 0): log('navi_route init') - if not params or not params.get('back'): + try: + focused_control = self.getFocus() + except: + focused_control = None + + if focused_control in self.navi['top_menu']: + self.navi['route'] = [self.navi['route'][0]] + + elif not params or not params.get('back'): log('***** self.navi[\'route\'].append *****' + str(mode) + str(params) + str(last_listing_item)) if not params: params = {'back': True} @@ -235,32 +250,30 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.right_menu(mode) self.listing.reset() - def search(self, params = None): + def search(self, params = {}): self.navi_route('search', params) get = params.get addtime = get('addtime') - query = None + query = get('query') - if params: - if get('url'): - search = urllib.unquote_plus(get('url')) - external = get("return_name") - if external: - searcher = 'landing from : %s ' % str(external) - else: - searcher = '' - self.setWindowTitle(title='%s %s' % ('Torrenter Search Window', searcher)) - if get('showKey') == 'true': - self.input_search.setText(search) - self.setFocus(self.input_search) - return - else: - self.input_search.setText(search) - query = search - # self.setFocus(self.listing) + if query: + search = urllib.unquote_plus(query) + external = get("return_name") + if external: + searcher = 'landing from : %s ' % str(external) else: - query = self.input_search.getText() + searcher = '' + #self.setWindowTitle(title='%s %s' % ('Torrenter Search Window', searcher)) + if get('showKey') == 'true': + self.input_search.setText(search) + self.setFocus(self.input_search) + return + else: + self.input_search.setText(search) + query = search + else: + query = self.input_search.getText() log('Search query: ' + str(query)) if not addtime and query == self.last_query: @@ -269,6 +282,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): searchersList = get_searchersList(addtime) # cache + self.navi['route'][-1]['query'] = query if (query != self.last_query or self.searchersList != searchersList) and len(query) > 0: self.filesList = get_filesList(query, searchersList, addtime) self.addtime = addtime @@ -283,7 +297,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.drawItem(title, {'mode': 'search_item', 'filename': link}, image) self.setFocus(self.listing) - def history(self, params = None): + def history(self, params = {}): self.navi_route('history', params) db = HistoryDB() @@ -423,7 +437,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): elif not tdir: self.right_menu('browser_subfolder') #self.reconnect(pyxbmct.ACTION_NAV_BACK, self.browser) - self.drawItem('..', {'mode': 'browser_moveup'}, isFolder=True) + self.drawItem('..', {'mode': 'browser_moveup'}, image = 'DefaultFolderBack.png', isFolder = True) dllist = sorted(Download().listfiles(hash), key=lambda x: x[0]) for name, percent, ind, size in dllist: if '/' not in name: @@ -469,7 +483,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if self.listing.size(): self.setFocus(self.listing) else: - self.setFocus(self.button_torrentclient) + self.setFocus(self.button_browser) return def browser_action(self, hash, action, tdir = None, ind = None): @@ -551,7 +565,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): return return - def downloadstatus(self): + def downloadstatus(self, params = {}): self.listing.reset() self.right_menu('downloadstatus') #self.reconnect(pyxbmct.ACTION_NAV_BACK, self.history) @@ -690,7 +704,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): #self.reconnect(pyxbmct.ACTION_NAV_BACK, self.downloadstatus) self.drawItem('..', {'mode': 'moveup', 'path': path, - 'tdir': os.path.dirname(tdir)}, isFolder=True) + 'tdir': os.path.dirname(tdir)}, image = 'DefaultFolderBack.png', isFolder=True) dirs, files = xbmcvfs.listdir(tdir + os.sep) if len(dirs) > 0: @@ -725,7 +739,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): params = {'mode': 'torrent_moveup', 'filename': link} else: params = {'mode': 'torrent_subfolder', 'filename': link} - self.drawItem('..', params, isFolder=True) + self.drawItem('..', params, image = 'DefaultFolderBack.png', isFolder=True) dirList = sorted(dirList, key=lambda x: x[0], reverse=False) for title in dirList: @@ -752,9 +766,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.localize('Download via T-client'), self.localize('Download via Libtorrent'), self.localize('Info'),] - elif mode in ['torrent_subfolder', 'torrent_moveup', - 'browser_moveup', 'file_browser', 'subfolder']: + elif mode in ['torrent_subfolder', 'file_browser', 'subfolder']: label_list = [self.localize('Open'),] + elif mode in ['torrent_moveup', 'browser_moveup']: + label_list = [self.localize('Move Up'),] elif mode in ['file']: label_list = [self.localize('Play'), ] elif mode in ['history', 'history_item']: @@ -784,6 +799,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): elif mode in ['watched', 'watched_item']: label_list = [self.localize('Open Torrent'), self.localize('Play (from start)'), self.localize('Play (with seek)'), self.localize('Delete'), self.localize('Clear History'), ] + self.right_label_count = len(label_list) return label_list def context(self): @@ -853,8 +869,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): label_list = self.get_menulist(mode) debug('set_menulist; ' + str(label_list)) - right_buttons_count = len(label_list) - button_num_list = range(1, right_buttons_count + 1) + button_num_list = range(1, self.right_label_count + 1) debug('set_menulist button_num_list: ' + str(button_num_list)) for index in button_num_list: @@ -862,10 +877,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.setlabel(button, (label_list[index - 1])) button.setEnabled(True) - debug('set_menulist self.right_buttons_count: ' + str(right_buttons_count)) - debug('set_menulist right_buttons_count: ' + str(right_buttons_count)) - if self.right_buttons_count > right_buttons_count: - disable_button_num_list = range(right_buttons_count + 1, self.right_buttons_count + 1) + if self.right_buttons_count > self.right_label_count: + disable_button_num_list = range(self.right_label_count + 1, self.right_buttons_count + 1) debug('set_menulist disable_button_num_list: ' + str(disable_button_num_list)) for index in disable_button_num_list: button = getattr(self, "button_right" + str(index)) @@ -1063,7 +1076,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): return url - def controlCenter(self, params={}): + def controlcenter(self, params={}): import controlcenter controlcenter.main() From d985d5e2caf685c85bc6f465fe5e09e0a3a46798 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sat, 17 Dec 2016 16:02:36 +0300 Subject: [PATCH 065/126] still broken --- Anteoloader.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Anteoloader.py b/Anteoloader.py index 2638c94..401c903 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -320,21 +320,18 @@ class AnteoPlayer(xbmc.Player): continue log('[AnteoPlayer]: ************************************* NO! break') + showMessage(self.localize('Information'), + self.localize('Stopping the torrent2http process...'), forced=True) break - xbmc.Player().stop() + self.stop() if '1' != self.__settings__.getSetting("keep_files") and 'Saved Files' not in self.userStorageDirectory: xbmc.sleep(1000) clearStorage(self.userStorageDirectory) - else: - #if self.seeding_status: - #showMessage(self.localize('Information'), - # self.localize('Torrent is seeding. To stop it use Download Status.'), forced=True) - #else: - #if self.seeding: self.db_delete() - showMessage(self.localize('Information'), - self.localize('Torrent downloading is stopped.'), forced=True) + + showMessage(self.localize('Information'), + self.localize('torrent2http process stopped.'), forced=True) def init(self): self.next_contentId = False @@ -523,8 +520,7 @@ class AnteoPlayer(xbmc.Player): listitem = self.get('listitem') listitem.setPath(url) - player = xbmc.Player() - player.play(url, listitem) + self.play(url, listitem) xbmc.sleep(2000) # very important, do not edit this, podavan i = 0 From 32afdf2afa67d861e8ad9ce694bac437057d7235 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Mon, 19 Dec 2016 19:53:58 +0300 Subject: [PATCH 066/126] save --- searchwindow.py | 78 ++++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 36 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index 710eb5e..c040a03 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -184,6 +184,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def navi_back(self): log('navi_back init') self.navi['route'].pop(-1) + self.navi_restore() + + def navi_restore(self): + log('navi_restore init') route = self.navi['route'][-1] action = getattr(self, route['mode']) if route['params']: @@ -227,7 +231,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.navi['last_right_button'] = self.navi['right_menu'].index(focused_control) + 1 self.update_navigation() - def navi_route(self, mode, params = {}, last_listing_item = 0): + def navi_route(self, mode, params = {}, right_menu = None): log('navi_route init') try: focused_control = self.getFocus() @@ -235,10 +239,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): focused_control = None if focused_control in self.navi['top_menu']: + log('focused_control in self.navi[\'top_menu\']') self.navi['route'] = [self.navi['route'][0]] - elif not params or not params.get('back'): - log('***** self.navi[\'route\'].append *****' + str(mode) + str(params) + str(last_listing_item)) + if not params or not params.get('back'): + log('***** self.navi[\'route\'].append *****' + str(mode) + str(params)) if not params: params = {'back': True} else: @@ -246,8 +251,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.navi['route'].append({'mode': mode, 'params': params, - 'last_listing_item': last_listing_item}) - self.right_menu(mode) + 'last_listing_item': 0}) + self.right_menu(mode if not right_menu else right_menu) self.listing.reset() def search(self, params = {}): @@ -337,9 +342,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.history() - def watched(self): - self.right_menu('watched') - self.listing.reset() + def watched(self, params = {}): + self.navi_route('watched', params) db = WatchedHistoryDB() @@ -401,19 +405,21 @@ class SearchWindow(pyxbmct.AddonDialogWindow): showMessage(self.localize('Watched History'), self.localize('Clear!')) self.watched() - def browser(self, hash = None, tdir = None): + def browser(self, params = {}): from resources.utorrent.net import Download - self.listing.reset() menu, dirs = [], [] + get = params.get + hash = get('hash') + tdir = get('tdir') + DownloadList = Download().list() if DownloadList == False: showMessage(self.localize('Error'), self.localize('No connection! Check settings!'), forced=True) return if not hash: - self.right_menu('browser') - #self.reconnect(pyxbmct.ACTION_NAV_BACK, self.history) + self.navi_route('browser') for data in DownloadList: status = " " img = '' @@ -431,12 +437,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): img = os.path.join(__root__, 'icons', 'download-icon.png') title = '[%s%%]%s%s [%s]' % (str(data['progress']), status, data['name'], str(data['ratio'])) - # title = '[' + str(data['progress']) + '%]' + status + data['name'] + ' [' + str(data['ratio']) + ']' menu.append( {"title": title, "image": img, "argv": {'mode': 'browser_item', 'hash': str(data['id'])}}) + elif not tdir: - self.right_menu('browser_subfolder') - #self.reconnect(pyxbmct.ACTION_NAV_BACK, self.browser) + self.navi_route('browser', params, 'browser_subfolder') self.drawItem('..', {'mode': 'browser_moveup'}, image = 'DefaultFolderBack.png', isFolder = True) dllist = sorted(Download().listfiles(hash), key=lambda x: x[0]) for name, percent, ind, size in dllist: @@ -448,9 +453,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): newtdir = name.split('/')[0] if newtdir not in dirs: dirs.append(newtdir) elif tdir: - self.right_menu('browser_subfolder') - tdir_up = tdir[:len(tdir)-len(tdir.split('/')[-1])-1] if '/' in tdir else None - self.drawItem('..', {'mode': 'browser_subfolder', 'hash': hash, 'tdir': tdir_up}, isFolder=True) + self.navi_route('browser', params, 'browser_subfolder') + self.drawItem('..', {'mode': 'browser_moveup'}, isFolder=True) dllist = sorted(Download().listfiles(hash), key=lambda x: x[0]) for name, percent, ind, size in dllist: @@ -493,7 +497,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): DownloadList = Download().list() if DownloadList == False: showMessage(self.localize('Error'), self.localize('No connection! Check settings!'), forced=True) - return + return False if (ind or ind == 0) and action in ('0', '3'): Download().setprio_simple(hash, action, ind) @@ -546,7 +550,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): xbmcvfs.copy(os.path.join(path, file), os.path.join(folder, file)) i = i + 1 showMessage(self.localize('Torrent-client Browser'), self.localize('Copied %d files!') % i, forced=True) - return + return True elif not tdir and action not in ('0', '3'): if action == 'removedata': ok = xbmcgui.Dialog().yesno(self.localize('Torrent-client Browser'), @@ -562,8 +566,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): else: menu.append((hash, action, str(ind))) Download().setprio_simple_multi(menu) - return - return + return True + return True def downloadstatus(self, params = {}): self.listing.reset() @@ -688,12 +692,18 @@ class SearchWindow(pyxbmct.AddonDialogWindow): xbmc.sleep(1000) self.downloadstatus() - def file_browser(self, mode, path, tdir): + def file_browser(self, params): + + self.navi_route('browser', params) + + get = params.get + mode = get('mode') + path = get('path') + tdir = get('tdir') path = encode_msg(path) tdir = encode_msg(tdir) - self.listing.reset() if tdir == os.path.dirname(path): self.downloadstatus() elif mode == 'file': @@ -962,10 +972,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): infoW = InfoWindow(ttl, yr) infoW.doModal() del infoW - elif mode == 'torrent_moveup': - if index == 1: - self.search() - self.setFocus(self.listing) + elif mode in ['torrent_moveup', 'browser_moveup', 'moveup']: + self.navi_back() elif mode == 'torrent_play': if index == 1: url = self.form_link('playTorrent', params) @@ -998,9 +1006,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if index == 4: action = 'fav' elif index == 5: action = 'delete' self.history_action(action, addtime, fav) - elif mode in ['browser_item', 'browser_subfolder', 'browser_moveup']: + elif mode in ['browser_item', 'browser_subfolder']: if index == 1: - self.browser(hash, tdir) + self.browser(params) elif index in [2, 3, 4] and mode =='browser_subfolder': if index == 2: action = '3' elif index == 3: action = '0' @@ -1015,10 +1023,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): elif index == 6: action = '0' elif index == 7: action = 'removedata' - self.browser_action(hash, action) - - if index in [4, 7]: - self.browser() + if self.browser_action(hash, action): + self.navi_restore() elif mode == 'browser_file': if index == 1: action = 'play' elif index == 2: action = '3' @@ -1037,8 +1043,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): elif index == 6: action = 'masscontrol' self.downloadstatus_action(action, params.get('addtime'), params.get('path'), params.get('type'), params.get('progress'), params.get('storage')) - elif mode in ['moveup', 'subfolder', 'file']: - self.file_browser(params.get('type'), params.get('path'), tdir) + elif mode in ['subfolder', 'file']: + self.file_browser(params) elif mode == 'watched_item': if index == 1: action = 'open' elif index == 2: action = 'playnoseek' From 0c44c02c120e48db568fe8e29126de37b1b5c481 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Mon, 19 Dec 2016 22:19:52 +0300 Subject: [PATCH 067/126] fix back --- Core.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Core.py b/Core.py index 9254033..57b3c47 100644 --- a/Core.py +++ b/Core.py @@ -1235,7 +1235,7 @@ class Core: filename = os.path.join(folder, filename) xbmc.executebuiltin('xbmc.PlayMedia("' + filename.encode('utf-8') + '")') elif tdir and action == 'copy': - path=os.path.join(localize_path(folder), localize_path(tdir)) + path=os.path.join(folder, tdir) dirs, files=xbmcvfs.listdir(path) if len(dirs) > 0: dirs.insert(0, self.localize('./ (Root folder)')) @@ -1250,10 +1250,9 @@ class Core: path=os.path.join(path, dirs[ret]) dirs, files=xbmcvfs.listdir(path) for file in files: - file = localize_path(file) - if not xbmcvfs.exists(os.path.join(path, file)): + if not xbmcvfs.exists(os.path.join(path,file)): xbmcvfs.delete(os.path.join(path,file)) - xbmcvfs.copy(os.path.join(path, file),os.path.join(folder,file)) + xbmcvfs.copy(os.path.join(path,file),os.path.join(folder,file)) i=i+1 showMessage(self.localize('Torrent-client Browser'), self.localize('Copied %d files!') % i, forced=True) return @@ -1491,8 +1490,7 @@ class Core: self.__settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) if fileIndex==None: fileIndex = chooseFile(torrent.getContentList()) if fileIndex: - item = get_item() - self.playTorrent({'url': fileIndex, 'listitem': item}) + xbmc.executebuiltin('xbmc.RunPlugin("plugin://plugin.video.torrenter/?action=playTorrent&url='+fileIndex+'")') def openTorrent(self, params={}): get = params.get @@ -1608,7 +1606,7 @@ class Core: def searchWindow(self, params={}): import searchwindow - searchwindow.main() + searchwindow.main(params) def showFilesList(self, filesList, params={}): get = params.get From 9315776648bb67c8a400d139c3baf7e81f589301 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Wed, 21 Dec 2016 18:52:26 +0300 Subject: [PATCH 068/126] back update --- .idea/workspace.xml | 2467 ++++++++++++++++++++++--------------------- searchwindow.py | 3 +- 2 files changed, 1278 insertions(+), 1192 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index a1da39e..05b9e70 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,10 +2,7 @@ - - - @@ -39,8 +36,8 @@ - - + + @@ -48,11 +45,11 @@ - - + + - - + + @@ -61,20 +58,24 @@ - - + + - + + + + + - - + + - - + + @@ -83,8 +84,8 @@ - - + + @@ -94,414 +95,345 @@ - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -510,19 +442,28 @@ - - + + - - + + - - - + + + + + + + + + + + + @@ -540,44 +481,46 @@ - HistoryDB - self.db - controlCenter - setAnimation - AddonDialogWindow - showFilesList - openSection - items - Default - save_folder - xbmc.Run - addI - downloadFilesList - .info() - info - self.torrentFileInfo - name - chooseHASH - self.button_right1 - set_navigation + Torrenter Search Window + self.reconnect(pyxbmct.ACTION_NAV_BACK + last_listing_mode + last_action + last_link + last_right_buttons_count right_buttons_count - self.reconnect(pyxbmct.ACTION_NAV_BACK, self.close) - progressBar - getTorrentFile - 30018 - titleMake - params - version_check - right_press1 - last_mode + playSTRM + set_resolved_url + Unable to rename torrent file from + self. + listitem + setAnimation + last_right_button + self.back + self.reconnect(pyxbmct.ACTION_NAV_BACK, self.history) + right_menu_set_label + navi_u + self.search( + navi_route + navi_back + pyxbmct.ACTION_NAV_BACK + self.open_torrent + Fuck this! + .play + self.display_name + self.right_buttons_count + move + '..' + WINDOW_FULLSCREEN_VIDEO pyxbmct.Button( button_history button_right1 self.right_press1 - action self.progressBar + action + __settings__ + get @@ -591,8 +534,6 @@ @@ -957,125 +824,6 @@ @@ -1318,8 +1185,8 @@ - - + + @@ -1369,22 +1236,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1473,13 +1284,6 @@ - - - - - - - @@ -1563,13 +1367,6 @@ - - - - - - - @@ -1577,13 +1374,6 @@ - - - - - - - @@ -1591,19 +1381,10 @@ - - - - - - - - - @@ -1614,13 +1395,6 @@ - - - - - - - @@ -1659,462 +1433,773 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + + + + + diff --git a/searchwindow.py b/searchwindow.py index c040a03..f18e998 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -138,8 +138,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.connect(pyxbmct.ACTION_NAV_BACK, self.navi_back) self.connect(pyxbmct.ACTION_PREVIOUS_MENU, self.navi_back) + self.connect(xbmcgui.ACTION_BACKSPACE, self.navi_back) + self.connect(xbmcgui.KEY_BUTTON_BACK, self.navi_back) - self.connect(pyxbmct.ACTION_PREVIOUS_MENU, self.close) self.connect(ACTION_MOUSE_RIGHT_CLICK, self.context) self.connect(ACTION_CONTEXT_MENU, self.context) self.connect(ACTION_SHOW_OSD, self.context) From 265b7f87d7e269c3852e9bc34b9e42ea295fb43b Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Thu, 22 Dec 2016 21:14:19 +0300 Subject: [PATCH 069/126] fix back --- Core.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Core.py b/Core.py index 57b3c47..3ffd589 100644 --- a/Core.py +++ b/Core.py @@ -1235,7 +1235,7 @@ class Core: filename = os.path.join(folder, filename) xbmc.executebuiltin('xbmc.PlayMedia("' + filename.encode('utf-8') + '")') elif tdir and action == 'copy': - path=os.path.join(folder, tdir) + path = os.path.join(localize_path(folder), localize_path(tdir)) dirs, files=xbmcvfs.listdir(path) if len(dirs) > 0: dirs.insert(0, self.localize('./ (Root folder)')) @@ -1250,9 +1250,10 @@ class Core: path=os.path.join(path, dirs[ret]) dirs, files=xbmcvfs.listdir(path) for file in files: - if not xbmcvfs.exists(os.path.join(path,file)): - xbmcvfs.delete(os.path.join(path,file)) - xbmcvfs.copy(os.path.join(path,file),os.path.join(folder,file)) + file = localize_path(file) + if not xbmcvfs.exists(os.path.join(path, file)): + xbmcvfs.delete(os.path.join(path, file)) + xbmcvfs.copy(os.path.join(path, file),os.path.join(folder, file)) i=i+1 showMessage(self.localize('Torrent-client Browser'), self.localize('Copied %d files!') % i, forced=True) return From 8cb1b2326047bf46bfe79b012e664517cc64256d Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Thu, 22 Dec 2016 21:25:21 +0300 Subject: [PATCH 070/126] fix back --- Anteoloader.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Anteoloader.py b/Anteoloader.py index 401c903..b1676ab 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -324,7 +324,7 @@ class AnteoPlayer(xbmc.Player): self.localize('Stopping the torrent2http process...'), forced=True) break - self.stop() + xbmc.Player().stop() if '1' != self.__settings__.getSetting("keep_files") and 'Saved Files' not in self.userStorageDirectory: xbmc.sleep(1000) @@ -520,7 +520,8 @@ class AnteoPlayer(xbmc.Player): listitem = self.get('listitem') listitem.setPath(url) - self.play(url, listitem) + player = xbmc.Player() + player.play(url, listitem) xbmc.sleep(2000) # very important, do not edit this, podavan i = 0 From 8010a8bc0670690372fe955ffac355196e30af9a Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sat, 24 Dec 2016 12:15:19 +0300 Subject: [PATCH 071/126] xbmc00 skin --- functions.py | 47 ++++++++++++++++++-------- resources/language/English/strings.xml | 1 + resources/language/Russian/strings.xml | 1 + resources/settings.xml | 2 +- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/functions.py b/functions.py index 7b4edd2..a80ff76 100644 --- a/functions.py +++ b/functions.py @@ -590,9 +590,25 @@ def view_style(func): elif view_style == 5: styles['uTorrentBrowser'] = styles['torrentPlayer'] = 'wide' styles['openTorrent'] = styles['History'] = styles['DownloadStatus'] = 'wide' - styles['drawtrackerList'] = styles['drawContent'] = styles['List'] = styles['sectionMenu'] = 'icons' + styles['drawtrackerList'] = styles['drawContent'] = styles['List'] = styles['sectionMenu'] = 'list' styles['searchOption'] = 'info' + if view_style == 8: + styles['sectionMenu'] = 'thumbnails' #меню + styles['List'] = 'biglist' + styles['Seasons'] = 'biglist' + styles['uTorrentBrowser'] = 'biglist' + styles['torrentPlayer'] = 'biglist' + styles['openTorrent'] = 'biglist' + styles['History'] = 'biglist' #история поиска + styles['DownloadStatus'] = 'biglist' #статус загрузки + styles['drawtrackerList'] = 'biglist' + styles['drawContent'] = 'list' #списки медиа + styles['drawcontentList'] = 'extrainfo' #списки медиа - лист + styles['searchOption'] = 'biglist' + styles['showFilesList'] = 'biglist' + + if view_style in [1, 3, 4, 5]: num_skin = 0 elif view_style == 2: @@ -601,6 +617,8 @@ def view_style(func): num_skin = 2 elif view_style == 7: num_skin = 3 + if view_style == 8: + num_skin = 4 style = styles.get(func) log('[view_style]: lock '+str(style)+' for '+str(func)) @@ -614,6 +632,7 @@ def lockView(viewId='info', num_skin=0): {'list': 50, 'info': 51, 'wide': 52, 'icons': 53, }, # Transperency! {'list': 55, 'info': 55, 'wide': 55, 'icons': 55, 'info3': 55, }, # Aeon Nox {'list': 50, 'info': 54, 'wide': 55, 'icons': 54, 'info3': 500, }, # Estuary + {'list': 50, 'bigwide': 51, 'biglist': 52, 'poster': 53, 'banner': 54, 'wall': 55, 'mediainfo': 56, 'extrainfo': 57, "cards":58, "bannerwall":59, 'thumbnails': 500, 'postersquare': 503, 'wallsquare': 505, }, # Arctic: Zephyr ) try: if viewId == 'wide' and num_skin == 3: @@ -633,19 +652,17 @@ def lockView(viewId='info', num_skin=0): View_501_Banner View_502_FanArt ''' - - ''' - PosterWrapView2_Fanart - MediaListView3 - MediaListView2 - MediaListView4 - WideIconView - MusicVideoInfoListView - AddonInfoListView1 - AddonInfoThumbView1 - LiveTVView1 - ''' + PosterWrapView2_Fanart + MediaListView3 + MediaListView2 + MediaListView4 + WideIconView + MusicVideoInfoListView + AddonInfoListView1 + AddonInfoThumbView1 + LiveTVView1 + ''' def torrent_dir(): @@ -1992,7 +2009,7 @@ def check_network_advancedsettings(): file_cont=''' 2 - 30 + 30 252420 5 @@ -2009,7 +2026,7 @@ def check_network_advancedsettings(): ''' 2 - 30 + 30 252420 5 diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 224b7f3..ad58650 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -73,6 +73,7 @@ In the end In the beginning Second string + Arctic: Zephyr (by xbmc00) Interface P2P Network Advanced diff --git a/resources/language/Russian/strings.xml b/resources/language/Russian/strings.xml index 9135c31..168a464 100644 --- a/resources/language/Russian/strings.xml +++ b/resources/language/Russian/strings.xml @@ -73,6 +73,7 @@ В конце В начале Второй строкой + Arctic: Zephyr (от xbmc00) Интерфейс P2P Сеть Дополнительные diff --git a/resources/settings.xml b/resources/settings.xml index 17aa405..3dfbcf9 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -4,7 +4,7 @@ - + From f45dd93a578b13335aa9e82a50e2b8ce654816d1 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sat, 24 Dec 2016 12:34:18 +0300 Subject: [PATCH 072/126] fix --- functions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/functions.py b/functions.py index a80ff76..22736e3 100644 --- a/functions.py +++ b/functions.py @@ -1324,7 +1324,8 @@ def search(url, searchersList, isApi=None): progressBar.close() for k in result.keys(): - filesList.extend(result[k]) + if result.get(k): + filesList.extend(result[k]) return filesList def get_filesList(query, searchersList, addtime = None): From cb16b0d91841ad4783a40f2705384b4e849d2ac1 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Mon, 26 Dec 2016 22:52:47 +0300 Subject: [PATCH 073/126] search fix --- Content.py | 7 ++++--- Core.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Content.py b/Content.py index 1df2910..0e57fc5 100644 --- a/Content.py +++ b/Content.py @@ -132,7 +132,8 @@ class Content: else: get = self.category_dict[category][subcategory] - if category == 'search': get = (get[0], get[1] % urllib.quote_plus(subcategory.encode('utf-8'))) + if category == 'search' and subcategory != True: + get = (get[0], get[1] % urllib.quote_plus(subcategory.encode('utf-8'))) property = self.get_property(category, subcategory) @@ -173,8 +174,8 @@ class Content: except: pass if has_property: - if category == 'search': property['page'] = property['page'] % urllib.quote_plus( - subcategory.encode('utf-8')) + if category == 'search' and subcategory != True: + property['page'] = property['page'] % urllib.quote_plus(subcategory.encode('utf-8')) return property diff --git a/Core.py b/Core.py index 3ffd589..445e548 100644 --- a/Core.py +++ b/Core.py @@ -727,6 +727,19 @@ class Core: else: if provider: self.Content = self.contenterObject[provider] + if category == 'search' and provider and subcategory == True: + keyboard = xbmc.Keyboard('', self.localize('Search Phrase') + ':') + keyboard.doModal() + query = keyboard.getText() + if not query: + return + elif keyboard.isConfirmed(): + subcategory = query + if subcategory: + apps['subcategory'] = subcategory + else: + return + if not self.Content.isTracker(): self.draw(apps, mode='content') else: @@ -742,6 +755,7 @@ class Core: page = apps.get('page') if apps.get('page') else 1 sort = apps.get('sort') if apps.get('sort') else 0 apps_property={'page':page, 'sort':sort} + log('draw: '+str((category, subcategory))) property = self.Content.get_property(category, subcategory) contentList = self.Content.get_contentList(category, subcategory, apps_property) if property and property.get('page'): From 034c1f7c9e747b18cd0cc78ebf442f9215d9a316 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Mon, 26 Dec 2016 23:36:50 +0300 Subject: [PATCH 074/126] search fix --- Core.py | 4 ++-- resources/contenters/KinoPoisk.py | 23 +++++++++++++++-------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Core.py b/Core.py index 445e548..7286a3f 100644 --- a/Core.py +++ b/Core.py @@ -736,7 +736,7 @@ class Core: elif keyboard.isConfirmed(): subcategory = query if subcategory: - apps['subcategory'] = subcategory + apps['subcategory'] = subcategory.decode('utf-8') else: return @@ -911,7 +911,7 @@ class Core: progressBar.update(iterator, dialogText, title, scrapers[scraper]) meta = self.Scraper.scraper(scraper, {'label': title, 'search': search, 'year': year}, self.language) - #print 'meta:'+str(meta) + log('meta:'+str(meta)) if self.language == 'ru': if not meta.get('info').get('title') or \ not meta.get('properties').get('fanart_image') or not meta.get('icon'): diff --git a/resources/contenters/KinoPoisk.py b/resources/contenters/KinoPoisk.py index d8f040b..a46cd66 100644 --- a/resources/contenters/KinoPoisk.py +++ b/resources/contenters/KinoPoisk.py @@ -104,22 +104,23 @@ class KinoPoisk(Content.Content): return True def get_contentList(self, category, subcategory=None, apps_property=None): + #self.debug=self.log socket.setdefaulttimeout(15) contentList = [] url = self.get_url(category, subcategory, apps_property) - #print url + self.debug('get_contentList: url = '+url) response = self.makeRequest(url, headers=self.headers) if None != response and 0 < len(response): - #print response + self.debug(str(response)) if category in ['hot']: contentList = self.popmode(response) elif url.startswith(self.baseurl + '/s/type/film/list/'): contentList = self.infomode(response) else: contentList = self.topmode(response) - #print str(contentList) + self.debug('get_contentList: contentList = '+str(contentList)) return contentList def stripTtl(self, title): @@ -132,12 +133,12 @@ class KinoPoisk(Content.Content): contentList = [] Soup = BeautifulSoup(response) result = Soup.find('div', 'stat').findAll('div', 'el') - #print str(result) + self.debug('popmode: '+str(result)) for tr in result: #main a = tr.findAll('a') num = a[0].text - #print num + info = {} year = 0 img = '' @@ -152,12 +153,14 @@ class KinoPoisk(Content.Content): img = self.id2img(id[0]) try: title, year = re.compile('(.+?) \((\d\d\d\d)\)', re.DOTALL).findall(a[1].text)[0] + #self.log('popmode 1'+str((title, year))) except: pass if not year: try: title, year = re.compile('(.+?) \(.*(\d\d\d\d)').findall(a[1].text)[0] info['tvshowtitle'] = title + #self.log('popmode 2' + str((title, year))) except: pass title = self.stripHtml(self.stripTtl(title)) @@ -176,7 +179,7 @@ class KinoPoisk(Content.Content): contentList = [] Soup = BeautifulSoup(response) result = Soup.find('table', {'cellpadding': '3'}).findAll('tr')[2:] - #print str(result) + self.debug('topmode: ' + str(result)) for tr in result: #main td = tr.findAll('td') @@ -198,8 +201,12 @@ class KinoPoisk(Content.Content): year = re.compile('(.+) \((\d\d\d\d)\)').findall(a_all.text) if not year: try: - title, year = re.compile('(.+) \(.*(\d\d\d\d)').findall(a_all.text)[0] - info['tvshowtitle'] = title + match = re.search(r"(.+) \((\d\d\d\d) –|(.+) \(.*(\d\d\d\d)", a_all.text, + re.IGNORECASE | re.MULTILINE) + if match: + title = match.group(1) + year = match.group(2) + info['tvshowtitle'] = title except: title = a_all.text else: From 6597ba8555c6f2f61d1613cce287d42e8b819511 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Mon, 26 Dec 2016 23:39:35 +0300 Subject: [PATCH 075/126] still alive --- searchwindow.py | 84 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 60 insertions(+), 24 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index f18e998..b91cc8f 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -21,6 +21,7 @@ import pyxbmct.addonwindow as pyxbmct import xbmcaddon import xbmcgui import xbmcvfs +import json from functions import * @@ -42,10 +43,6 @@ ACTION_SHOW_OSD = 24 class SearchWindow(pyxbmct.AddonDialogWindow): __settings__ = sys.modules["__main__"].__settings__ - fileList = [] - contentList = [] - searchersList = [] - addtime = None right_buttons_count = 7 right_label_count = 7 last_right_buttons_count = 0 @@ -55,11 +52,14 @@ class SearchWindow(pyxbmct.AddonDialogWindow): last_right_button = None last_listing_mode = None count = 0 + navi_right_menu = [] + navi_top_menu = [] navi = { 'last_top_button' : 4, 'last_right_button' : 1, - 'right_menu' : [], - 'top_menu' : [], + 'contentList' : [], + 'searchersList' : [], + 'addtime' : None, 'route':[{'mode':'close', 'params':{}, 'last_listing_item': 0}] } @@ -71,9 +71,13 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.setGeometry(1280, 720, 9, 16) self.set_controls() self.connect_controls() - if params: - self.search(params) + if params and params.get('mode'): + if params.get('mode') == 'load': + self.navi_load() + elif params.get('mode') == 'search': + self.search(params) else: + #self.navi_load() self.history() if self.listing.size(): @@ -120,7 +124,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): _itemTextYOffset=0, _itemHeight=60, _space=0, _alignmentY=4) self.placeControl(self.listing, 1, 0, 8, 14) - self.navi['top_menu'] = [self.button_downloadstatus, self.button_browser, self.button_keyboard, + self.navi_top_menu = [self.button_downloadstatus, self.button_browser, self.button_keyboard, self.input_search, self.button_search, self.button_history, self.button_watched, self.button_controlcenter] @@ -163,10 +167,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.update_navigation() def update_navigation(self): - self.last_top_button = self.navi['top_menu'][self.navi['last_top_button'] - 1] + self.last_top_button = self.navi_top_menu[self.navi['last_top_button'] - 1] if self.navi['last_right_button'] > self.right_label_count: self.navi['last_right_button'] = self.right_label_count - self.last_right_button = self.navi['right_menu'][self.navi['last_right_button'] - 1] + self.last_right_button = self.navi_right_menu[self.navi['last_right_button'] - 1] # Top menu self.button_downloadstatus.setNavigation(self.listing, self.listing, self.last_right_button, @@ -200,6 +204,36 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if route['last_listing_item'] > 0: self.listing.selectItem(route['last_listing_item']) + def navi_load(self): + log('navi_load init') + __tmppath__ = os.path.join(xbmc.translatePath('special://temp'), 'xbmcup', 'plugin.video.torrenter') + if not xbmcvfs.exists(__tmppath__): + xbmcvfs.mkdirs(__tmppath__) + navi_file = os.path.join(__tmppath__, 'navi.txt') + read = xbmcvfs.File(navi_file, 'r') + navi = read.read() + read.close() + + log('navi: '+str(navi)) + + if navi and len(navi) > 0: + self.navi = json.loads(urllib.unquote_plus(navi)) + self.navi_restore() + + def navi_save(self): + log('navi_save init') + navi = urllib.quote_plus(json.dumps(self.navi)) + + __tmppath__ = os.path.join(xbmc.translatePath('special://temp'), 'xbmcup', 'plugin.video.torrenter') + if not xbmcvfs.exists(__tmppath__): + xbmcvfs.mkdirs(__tmppath__) + navi_file = os.path.join(__tmppath__, 'navi.txt') + write = xbmcvfs.File(navi_file, 'w') + write.write(navi) + write.close() + + #__settings__.setSetting("navi", navi) + def navi_update(self): log('navi_update init') try: @@ -224,12 +258,12 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.set_menulist(mode) self.update_navigation() - elif focused_control in self.navi['top_menu']: - self.navi['last_top_button'] = self.navi['top_menu'].index(focused_control) + 1 + elif focused_control in self.navi_top_menu: + self.navi['last_top_button'] = self.navi_top_menu.index(focused_control) + 1 self.update_navigation() - elif focused_control in self.navi['right_menu']: - self.navi['last_right_button'] = self.navi['right_menu'].index(focused_control) + 1 + elif focused_control in self.navi_right_menu: + self.navi['last_right_button'] = self.navi_right_menu.index(focused_control) + 1 self.update_navigation() def navi_route(self, mode, params = {}, right_menu = None): @@ -239,7 +273,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): except: focused_control = None - if focused_control in self.navi['top_menu']: + if focused_control in self.navi_top_menu: log('focused_control in self.navi[\'top_menu\']') self.navi['route'] = [self.navi['route'][0]] @@ -283,16 +317,16 @@ class SearchWindow(pyxbmct.AddonDialogWindow): log('Search query: ' + str(query)) if not addtime and query == self.last_query: - addtime = self.addtime + addtime = self.navi['addtime'] searchersList = get_searchersList(addtime) # cache self.navi['route'][-1]['query'] = query - if (query != self.last_query or self.searchersList != searchersList) and len(query) > 0: + if (query != self.last_query or self.navi['searchersList'] != searchersList) and len(query) > 0: self.filesList = get_filesList(query, searchersList, addtime) - self.addtime = addtime - self.searchersList = searchersList + self.navi['addtime'] = addtime + self.navi['searchersList'] = searchersList self.last_query = query elif len(query) == 0: self.filesList = [] @@ -741,10 +775,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): # cache if link != self.last_link: - self.contentList = get_contentList(link) + self.navi['contentList'] = get_contentList(link) self.last_link = link - dirList, contentListNew = cutFolder(self.contentList, tdir) + dirList, contentListNew = cutFolder(self.navi['contentList'], tdir) if not tdir: params = {'mode': 'torrent_moveup', 'filename': link} @@ -768,6 +802,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): params = {'mode': 'torrent_play', 'url': identifier, 'url2': ids_video.rstrip(','), 'filename': link} self.drawItem(title, params) + self.navi_save() + def get_menulist(self, mode): label_list = ["Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty"] @@ -838,7 +874,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.removeControls(remove_list) label_list = self.get_menulist(mode) - self.navi['right_menu'] = [] + self.navi_right_menu = [] self.right_buttons_count = len(label_list) button_num_list = range(1, self.right_buttons_count + 1) @@ -853,7 +889,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.navi['last_right_button'] = 1 for index in button_num_list: button = getattr(self, "button_right" + str(index)) - self.navi['right_menu'].append(button) + self.navi_right_menu.append(button) if self.right_buttons_count == 1: button.setNavigation(self.button_controlcenter, From e1360e2b97ae66073667363a0e7ca74180dd90fb Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Tue, 27 Dec 2016 18:47:09 +0300 Subject: [PATCH 076/126] ssl fix --- Content.py | 7 +++++++ SearcherABC.py | 14 ++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Content.py b/Content.py index 0e57fc5..3ce544f 100644 --- a/Content.py +++ b/Content.py @@ -26,6 +26,7 @@ import re from StringIO import StringIO import gzip import HTMLParser +import ssl from datetime import date import Localization @@ -182,6 +183,12 @@ class Content: def makeRequest(self, url, data={}, headers=[]): self.cookieJar = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookieJar)) + # python ssl Context support - PEP 0466 + if hasattr(ssl, '_create_unverified_context'): + ssl_context = ssl._create_unverified_context() + opener.add_handler(urllib2.HTTPSHandler(context=ssl_context)) + else: + opener.add_handler(urllib2.HTTPSHandler()) opener.addheaders = headers if 0 < len(data): encodedData = urllib.urlencode(data) diff --git a/SearcherABC.py b/SearcherABC.py index 913c8d2..6d4b16f 100644 --- a/SearcherABC.py +++ b/SearcherABC.py @@ -35,6 +35,7 @@ import xbmc import Localization from functions import log, debug, showMessage +import ssl class SearcherABC: searchIcon = '/icons/video.png' @@ -103,19 +104,24 @@ class SearcherABC: def makeRequest(self, url, data={}, headers={}): self.load_cookie() - opener = None + opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookieJar)) if self.proxy == 1: try: from resources.proxy import antizapret - opener = urllib2.build_opener(antizapret.AntizapretProxyHandler(), urllib2.HTTPCookieProcessor(self.cookieJar)) + opener.add_handler(antizapret.AntizapretProxyHandler()) config = antizapret.config() self.debug('[antizapret]: '+str(config["domains"])) self.debug('[antizapret]: '+str(config["server"])) except: showMessage('AntiZapret', Localization.localize('Error')) self.debug('[antizapret]: OFF!') - if not opener: - opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookieJar)) + # python ssl Context support - PEP 0466 + if hasattr(ssl, '_create_unverified_context'): + ssl_context = ssl._create_unverified_context() + opener.add_handler(urllib2.HTTPSHandler(context=ssl_context)) + else: + opener.add_handler(urllib2.HTTPSHandler()) + opener.addheaders = headers if 0 < len(data): encodedData = urllib.urlencode(data) From 09a555df0fb8c518f25a8b3305b0750dd7ddaa78 Mon Sep 17 00:00:00 2001 From: ElAntonioB Date: Thu, 29 Dec 2016 09:13:17 +0200 Subject: [PATCH 077/126] Use xbmc.translatePath on storage setting Convert special:// path to absolute ones for file operations to work. Fix reference to "path" setting for AceStream --- Core.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Core.py b/Core.py index 7286a3f..2cd1eab 100644 --- a/Core.py +++ b/Core.py @@ -30,7 +30,7 @@ class Core: __plugin__ = sys.modules["__main__"].__plugin__ __settings__ = sys.modules["__main__"].__settings__ ROOT = sys.modules["__main__"].__root__ - userStorageDirectory = localize_path(__settings__.getSetting("storage"))#file_encode(__settings__.getSetting("storage")) + userStorageDirectory = localize_path(xbmc.translatePath(__settings__.getSetting("storage")))#file_encode(__settings__.getSetting("storage")) torrentFilesDirectory = 'torrents' debug = __settings__.getSetting('debug') == 'true' torrent_player = __settings__.getSetting("torrent_player") @@ -1455,9 +1455,9 @@ class Core: #xbmc.executebuiltin('xbmc.RunPlugin("plugin://plugin.video.yatp/?action=play&torrent=%s&file_index=%s")' % (urllib.quote_plus(torrentUrl), params['url'])) elif self.torrent_player == '1': __ASsettings__ = xbmcaddon.Addon(id='script.module.torrent.ts') - folder=__ASsettings__.getSetting("folder") + folder=__ASsettings__.getSetting("path") save=__ASsettings__.getSetting("save") - __ASsettings__.setSetting("folder", self.__settings__.getSetting("storage")) + __ASsettings__.setSetting("path", xbmc.translatePath(self.__settings__.getSetting("storage"))) __ASsettings__.setSetting("save", self.__settings__.getSetting("keep_files")) xbmc.sleep(1000) torrent = Downloader.Torrent(self.userStorageDirectory, torrentUrl, self.torrentFilesDirectory) @@ -1468,7 +1468,7 @@ class Core: label = unquote(get("label"), os.path.basename(path)) torrent.play_url_ind(int(ind), label, icon) torrent.__exit__() - __ASsettings__.setSetting("folder", folder) + __ASsettings__.setSetting("path", folder) __ASsettings__.setSetting("save", save) def saveUrlTorrent(self, url): From 6b5ffb56da9e2f90529ed011a86a585fa15f2627 Mon Sep 17 00:00:00 2001 From: ElAntonioB Date: Thu, 29 Dec 2016 09:15:52 +0200 Subject: [PATCH 078/126] storage path usage fix for functions.py --- functions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functions.py b/functions.py index 22736e3..846d037 100644 --- a/functions.py +++ b/functions.py @@ -43,7 +43,7 @@ except: __settings__ = xbmcaddon.Addon(id='plugin.video.torrenter') __language__ = __settings__.getLocalizedString ROOT = __settings__.getAddonInfo('path') # .decode('utf-8').encode(sys.getfilesystemencoding()) -userStorageDirectory = __settings__.getSetting("storage") +userStorageDirectory = xbmc.translatePath(__settings__.getSetting("storage")) torrentFilesDirectory = 'torrents' USERAGENT = "Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.0" __addonpath__ = __settings__.getAddonInfo('path') @@ -2265,4 +2265,4 @@ def get_item(): }) item.setInfo(type='Video', infoLabels=infoLabels) - return item \ No newline at end of file + return item From 0adea94cd0f0ef5f08962fb14bed7760bff48daa Mon Sep 17 00:00:00 2001 From: ElAntonioB Date: Thu, 29 Dec 2016 15:07:46 +0200 Subject: [PATCH 079/126] Close dialogs before recursive call Here is how it would fail otherwise with local torrent: 10:31:40.149 T:6140948480 NOTICE: ### [Torrenter v.2.5.5ja]: Torrenter v.2.5.5ja 10:31:40.184 T:6140948480 NOTICE: ### [Torrenter v.2.5.5ja]: SYS ARGV: ['plugin://plugin.video.torrenter/', '3', '?action=torrentPlayer&url'] 10:31:40.441 T:6143242240 DEBUG: ------ Window Init (DialogBusy.xml) ------ 10:31:40.441 T:6143242240 DEBUG: Window DialogBusy.xml was already loaded 10:31:40.441 T:6143242240 DEBUG: Alloc resources: 0.09ms 10:31:40.443 T:6143242240 INFO: Loading skin file: FileBrowser.xml, load type: KEEP_IN_MEMORY 10:31:40.465 T:6143242240 DEBUG: Load FileBrowser.xml: 21.30ms 10:31:40.466 T:6143242240 DEBUG: Alloc resources: 22.84ms (21.71 ms skin load) 10:31:40.483 T:6143242240 DEBUG: ------ Window Init (FileBrowser.xml) ------ 10:31:40.484 T:6143242240 DEBUG: Window FileBrowser.xml was already loaded 10:31:40.484 T:6143242240 DEBUG: Alloc resources: 0.02ms 10:31:48.076 T:6143242240 DEBUG: ------ Window Deinit (FileBrowser.xml) ------ 10:31:48.112 T:6140948480 NOTICE: ### [Torrenter v.2.5.5ja]: Imported TSengine from ASCore 10:31:48.119 T:6140948480 DEBUG: DialogProgress::Open called 10:31:48.119 T:6140948480 DEBUG: ------ Window Init (DialogConfirm.xml) ------ 10:31:48.120 T:6140948480 DEBUG: Window DialogConfirm.xml was already loaded 10:31:48.120 T:6140948480 DEBUG: Alloc resources: 1.00ms 10:31:48.126 T:6140948480 DEBUG: NSUSerDefaults: compressed /userdata/addon_data/script.module.torrent.ts/settings.xml from 643 to 288 10:31:48.133 T:6140948480 DEBUG: Previous line repeats 1 times. 10:31:48.133 T:6140948480 NOTICE: ### [Torrenter v.2.5.5ja]: xbmcvfs.File for smb://srv/Main/Kodi/Torrents/293.torrent 10:31:48.136 T:6140948480 DEBUG: CSMBFile::Open - opened smb://srv/Main/Kodi/Torrents/293.torrent, fd=10000 10:31:48.145 T:6140948480 DEBUG: CSMBFile::Close closing fd 10000 10:31:49.604 T:6140948480 DEBUG: NSUSerDefaults: compressed /userdata/addon_data/plugin.video.torrenter/settings.xml from 4555 to 1068 10:31:49.643 T:6143242240 DEBUG: Previous line repeats 3 times. 10:31:49.643 T:6143242240 DEBUG: Activating window ID: 10025 10:31:49.643 T:6143242240 INFO: Activate of window '10025' refused because there are active modal dialogs 10:31:49.893 T:6143242240 DEBUG: ------ Window Deinit (DialogConfirm.xml) ------ 10:32:16.976 T:6148403200 DEBUG: Thread JobWorker 0 terminating (autodelete) --- Core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Core.py b/Core.py index 7286a3f..35e71b5 100644 --- a/Core.py +++ b/Core.py @@ -1397,6 +1397,7 @@ class Core: self.__settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) self.__settings__.setSetting("lastTorrentUrl", url) if url: + xbmc.executebuiltin("Dialog.Close(all,true)") xbmc.executebuiltin( 'XBMC.ActivateWindow(%s)' % 'Videos,plugin://plugin.video.torrenter/?action=%s&url=%s' % ('torrentPlayer', url)) From 5adeab3e24b368a9a0bb1e42ccec3f80300ce0fa Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Thu, 29 Dec 2016 20:44:48 +0300 Subject: [PATCH 080/126] remove keyboard --- searchwindow.py | 170 +++++++++++++++++++++++++----------------------- 1 file changed, 87 insertions(+), 83 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index b91cc8f..a4a3416 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -46,29 +46,21 @@ class SearchWindow(pyxbmct.AddonDialogWindow): right_buttons_count = 7 right_label_count = 7 last_right_buttons_count = 0 - last_link = None - last_query = None last_top_button = None last_right_button = None last_listing_mode = None count = 0 navi_right_menu = [] navi_top_menu = [] - navi = { - 'last_top_button' : 4, - 'last_right_button' : 1, - 'contentList' : [], - 'searchersList' : [], - 'addtime' : None, - 'route':[{'mode':'close', 'params':{}, 'last_listing_item': 0}] - } icon = __root__ + '/icons/searchwindow/%s.png' icon_tc = __root__ + '/icons/searchwindow/%s' + getTorrentClientIcon() def __init__(self, params = None): + log('SearchWindow init params: '+str(params)) super(SearchWindow, self).__init__(self.localize('Torrenter Search Window')) self.setGeometry(1280, 720, 9, 16) + self.set_navi() self.set_controls() self.connect_controls() if params and params.get('mode'): @@ -77,14 +69,27 @@ class SearchWindow(pyxbmct.AddonDialogWindow): elif params.get('mode') == 'search': self.search(params) else: - #self.navi_load() - self.history() + self.navi_load() + #self.history() if self.listing.size(): self.setFocus(self.listing) else: self.setFocus(self.input_search) + def set_navi(self): + self.navi = { + 'last_top_button': 4, + 'last_right_button': 1, + 'contentList': [], + 'searchersList': [], + 'filesList': [], + 'last_addtime': None, + 'last_query': None, + 'last_link': None, + 'route': [{'mode': 'close', 'params': {}, 'last_listing_item': 0}] + } + def set_controls(self): if not __settings__.getSetting('debug') == 'true': self.background.setImage('%s/icons/%s.png' % (__root__, 'ContentPanel')) @@ -95,38 +100,37 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.button_downloadstatus = pyxbmct.Button("", focusTexture=self.icon % 'fdownloadstatus', noFocusTexture=self.icon % 'nfdownloadstatus') - self.placeControl(self.button_downloadstatus, 0, 1, 1, 1) + self.placeControl(self.button_downloadstatus, 0, 2, 1, 1) self.button_browser = pyxbmct.Button("", focusTexture=self.icon_tc % 'f', noFocusTexture=self.icon_tc % 'nf') - self.placeControl(self.button_browser, 0, 2, 1, 1) - self.button_keyboard = pyxbmct.Button("", focusTexture=self.icon % 'fkeyboard', - noFocusTexture=self.icon % 'nfkeyboard') - self.placeControl(self.button_keyboard, 0, 3, 1, 1) - self.input_search = pyxbmct.Edit("", _alignment=pyxbmct.ALIGN_CENTER_X | pyxbmct.ALIGN_CENTER_Y) - self.placeControl(self.input_search, 0, 4, 1, 5) - self.button_search = pyxbmct.Button("", focusTexture=self.icon % 'fsearch', - noFocusTexture=self.icon % 'nfsearch') - self.placeControl(self.button_search, 0, 9, 1, 1) - self.button_history = pyxbmct.Button("", focusTexture=self.icon % 'fhistory', - noFocusTexture=self.icon % 'nfhistory') - self.placeControl(self.button_history, 0, 10, 1, 1) - self.button_watched = pyxbmct.Button("", focusTexture=self.icon % 'fwatched', - noFocusTexture=self.icon % 'nfwatched') - self.placeControl(self.button_watched, 0, 11, 1, 1) + self.placeControl(self.button_browser, 0, 3, 1, 1) self.button_controlcenter = pyxbmct.Button("", focusTexture=self.icon % 'fcontrolcenter', noFocusTexture=self.icon % 'nfcontrolcenter') - self.placeControl(self.button_controlcenter, 0, 12, 1, 1) + self.placeControl(self.button_controlcenter, 0, 4, 1, 1) + #self.button_keyboard = pyxbmct.Button("", focusTexture=self.icon % 'fkeyboard', + # noFocusTexture=self.icon % 'nfkeyboard') + #self.placeControl(self.button_keyboard, 0, 3, 1, 1) + self.input_search = pyxbmct.Edit("", _alignment=pyxbmct.ALIGN_CENTER_X | pyxbmct.ALIGN_CENTER_Y) + self.placeControl(self.input_search, 0, 5, 1, 6) + self.button_search = pyxbmct.Button("", focusTexture=self.icon % 'fsearch', + noFocusTexture=self.icon % 'nfsearch') + self.placeControl(self.button_search, 0, 11, 1, 1) + self.button_history = pyxbmct.Button("", focusTexture=self.icon % 'fhistory', + noFocusTexture=self.icon % 'nfhistory') + self.placeControl(self.button_history, 0, 12, 1, 1) + self.button_watched = pyxbmct.Button("", focusTexture=self.icon % 'fwatched', + noFocusTexture=self.icon % 'nfwatched') + self.placeControl(self.button_watched, 0, 13, 1, 1) # Main self.listing = pyxbmct.List(_imageWidth=60, _imageHeight=60, _itemTextXOffset=1, _itemTextYOffset=0, _itemHeight=60, _space=0, _alignmentY=4) self.placeControl(self.listing, 1, 0, 8, 14) - self.navi_top_menu = [self.button_downloadstatus, self.button_browser, self.button_keyboard, - self.input_search, self.button_search, self.button_history, self.button_watched, - self.button_controlcenter] + self.navi_top_menu = [self.button_downloadstatus, self.button_browser, self.button_controlcenter, + self.input_search, self.button_search, self.button_history, self.button_watched] # Right menu self.right_menu() @@ -157,12 +161,12 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def set_navigation(self): # Top menu self.button_browser.setNavigation(self.listing, self.listing, self.button_downloadstatus, - self.button_keyboard) - self.button_keyboard.setNavigation(self.listing, self.listing, self.button_browser, self.input_search) - self.input_search.setNavigation(self.listing, self.listing, self.button_keyboard, self.button_search) + self.button_controlcenter) + self.button_controlcenter.setNavigation(self.listing, self.listing, self.button_browser, self.input_search) + #self.button_keyboard.setNavigation(self.listing, self.listing, self.button_browser, self.input_search) + self.input_search.setNavigation(self.listing, self.listing, self.button_controlcenter, self.button_search) self.button_search.setNavigation(self.listing, self.listing, self.input_search, self.button_history) self.button_history.setNavigation(self.listing, self.listing, self.button_search, self.button_watched) - self.button_watched.setNavigation(self.listing, self.listing, self.button_history, self.button_controlcenter) self.update_navigation() @@ -175,7 +179,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): # Top menu self.button_downloadstatus.setNavigation(self.listing, self.listing, self.last_right_button, self.button_browser) - self.button_controlcenter.setNavigation(self.listing, self.listing, self.button_watched, self.last_right_button) + self.button_watched.setNavigation(self.listing, self.listing, self.button_history, self.last_right_button) # Main self.listing.setNavigation(self.last_top_button, self.input_search, self.button_downloadstatus, @@ -189,20 +193,27 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def navi_back(self): log('navi_back init') self.navi['route'].pop(-1) + self.navi['route'][-1]['params']['back'] = True self.navi_restore() def navi_restore(self): log('navi_restore init') route = self.navi['route'][-1] action = getattr(self, route['mode']) - if route['params']: - action(route['params']) - else: - action() - self.setFocus(self.listing) - log('route[last_listing_item]: '+str(route['last_listing_item'])) - if route['last_listing_item'] > 0: - self.listing.selectItem(route['last_listing_item']) + try: + if route['params']: + action(route['params']) + else: + action() + self.setFocus(self.listing) + log('route[last_listing_item]: ' + str(route['last_listing_item'])) + if route['last_listing_item'] > 0: + self.listing.selectItem(route['last_listing_item']) + except: + import traceback + log('navi_restore ERROR '+traceback.format_exc()) + self.set_navi() + self.history() def navi_load(self): log('navi_load init') @@ -214,15 +225,15 @@ class SearchWindow(pyxbmct.AddonDialogWindow): navi = read.read() read.close() - log('navi: '+str(navi)) + log('navi_load navi: '+str(navi)) if navi and len(navi) > 0: - self.navi = json.loads(urllib.unquote_plus(navi)) + self.navi = json.loads(navi) self.navi_restore() def navi_save(self): log('navi_save init') - navi = urllib.quote_plus(json.dumps(self.navi)) + navi = json.dumps(self.navi) __tmppath__ = os.path.join(xbmc.translatePath('special://temp'), 'xbmcup', 'plugin.video.torrenter') if not xbmcvfs.exists(__tmppath__): @@ -232,8 +243,6 @@ class SearchWindow(pyxbmct.AddonDialogWindow): write.write(navi) write.close() - #__settings__.setSetting("navi", navi) - def navi_update(self): log('navi_update init') try: @@ -246,7 +255,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if focused_control == self.listing: item_index = self.listing.getSelectedPosition() self.navi['route'][-1]['last_listing_item'] = item_index - debug('self.listing getSelectedPosition ' + str(item_index)) + log('self.listing getSelectedPosition ' + str(item_index)) item = self.listing.getSelectedItem() params = json.loads(item.getfilename()) @@ -284,55 +293,53 @@ class SearchWindow(pyxbmct.AddonDialogWindow): else: params['back'] = True + if focused_control == self.listing: + item_index = self.listing.getSelectedPosition() + else: + item_index = 0 + self.navi['route'][-1]['last_listing_item'] == item_index + self.navi['route'].append({'mode': mode, 'params': params, 'last_listing_item': 0}) + self.right_menu(mode if not right_menu else right_menu) self.listing.reset() def search(self, params = {}): + log('search init params: ' + str(params)) self.navi_route('search', params) get = params.get addtime = get('addtime') query = get('query') + route = self.navi['route'][-1] if query: - search = urllib.unquote_plus(query) - external = get("return_name") - if external: - searcher = 'landing from : %s ' % str(external) - else: - searcher = '' - #self.setWindowTitle(title='%s %s' % ('Torrenter Search Window', searcher)) - if get('showKey') == 'true': - self.input_search.setText(search) - self.setFocus(self.input_search) - return - else: - self.input_search.setText(search) - query = search + self.input_search.setText(query) else: query = self.input_search.getText() + log('Search query: ' + str(query)) - if not addtime and query == self.last_query: - addtime = self.navi['addtime'] + if not addtime and query == self.navi['last_query']: + addtime = self.navi['last_addtime'] searchersList = get_searchersList(addtime) # cache - self.navi['route'][-1]['query'] = query - if (query != self.last_query or self.navi['searchersList'] != searchersList) and len(query) > 0: - self.filesList = get_filesList(query, searchersList, addtime) - self.navi['addtime'] = addtime + route['params']['query'] = query + if (query != self.navi['last_query'] or self.navi['searchersList'] != searchersList) and len(query) > 0: + self.navi['filesList'] = get_filesList(query, searchersList, addtime) + route['params']['addtime'] = addtime + self.navi['last_addtime'] = addtime self.navi['searchersList'] = searchersList - self.last_query = query + self.navi['last_query'] = query elif len(query) == 0: - self.filesList = [] + self.navi['filesList'] = [] - if self.filesList: - for (order, seeds, leechers, size, title, link, image) in self.filesList: + if self.navi['filesList']: + for (order, seeds, leechers, size, title, link, image) in self.navi['filesList']: title = titleMake(seeds, leechers, size, title) self.drawItem(title, {'mode': 'search_item', 'filename': link}, image) self.setFocus(self.listing) @@ -768,23 +775,20 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def open_torrent(self, params): self.navi_route('open_torrent', params) - # def open_torrent(self, link, tdir=None): + get = params.get link = get('link') tdir = get('tdir') # cache - if link != self.last_link: + if link != self.navi['last_link']: self.navi['contentList'] = get_contentList(link) - self.last_link = link + self.navi['last_link'] = link dirList, contentListNew = cutFolder(self.navi['contentList'], tdir) - if not tdir: - params = {'mode': 'torrent_moveup', 'filename': link} - else: - params = {'mode': 'torrent_subfolder', 'filename': link} - self.drawItem('..', params, image = 'DefaultFolderBack.png', isFolder=True) + self.drawItem('..', {'mode': 'torrent_moveup', 'filename': link}, + image = 'DefaultFolderBack.png', isFolder=True) dirList = sorted(dirList, key=lambda x: x[0], reverse=False) for title in dirList: From 2421b4d1dba6e052ae0e119299f86e45756290b4 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Thu, 29 Dec 2016 21:49:04 +0300 Subject: [PATCH 081/126] navi working? --- searchwindow.py | 121 +++++++++++++++++++++++------------------------- 1 file changed, 57 insertions(+), 64 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index a4a3416..d8900a8 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -49,6 +49,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): last_top_button = None last_right_button = None last_listing_mode = None + route = None count = 0 navi_right_menu = [] navi_top_menu = [] @@ -72,11 +73,6 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.navi_load() #self.history() - if self.listing.size(): - self.setFocus(self.listing) - else: - self.setFocus(self.input_search) - def set_navi(self): self.navi = { 'last_top_button': 4, @@ -193,22 +189,31 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def navi_back(self): log('navi_back init') self.navi['route'].pop(-1) - self.navi['route'][-1]['params']['back'] = True self.navi_restore() + def navi_route_reset(self): + log('navi_route_reset init') + self.navi['route'] = [self.navi['route'][0]] + + def navi_route_pop(self): + log('navi_route_pop init') + self.navi['route'].pop(-1) + def navi_restore(self): log('navi_restore init') - route = self.navi['route'][-1] - action = getattr(self, route['mode']) + self.route = self.navi['route'].pop(-1) + action = getattr(self, self.route['mode']) try: - if route['params']: - action(route['params']) + if self.route['params']: + action(self.route['params']) else: action() - self.setFocus(self.listing) - log('route[last_listing_item]: ' + str(route['last_listing_item'])) - if route['last_listing_item'] > 0: - self.listing.selectItem(route['last_listing_item']) + + self.set_focus(self.route['mode']) + + log('self.route[last_listing_item]: ' + str(self.route['last_listing_item'])) + if self.route['last_listing_item'] > 0: + self.listing.selectItem(self.route['last_listing_item']) except: import traceback log('navi_restore ERROR '+traceback.format_exc()) @@ -231,8 +236,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.navi = json.loads(navi) self.navi_restore() - def navi_save(self): + def navi_save(self, mode = None): log('navi_save init') + + if mode: self.set_focus(mode) + navi = json.dumps(self.navi) __tmppath__ = os.path.join(xbmc.translatePath('special://temp'), 'xbmcup', 'plugin.video.torrenter') @@ -284,28 +292,23 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if focused_control in self.navi_top_menu: log('focused_control in self.navi[\'top_menu\']') - self.navi['route'] = [self.navi['route'][0]] + self.navi_route_reset() - if not params or not params.get('back'): - log('***** self.navi[\'route\'].append *****' + str(mode) + str(params)) - if not params: - params = {'back': True} - else: - params['back'] = True + log('***** self.navi[\'route\'].append *****' + str(mode) + str(params)) - if focused_control == self.listing: - item_index = self.listing.getSelectedPosition() - else: - item_index = 0 - self.navi['route'][-1]['last_listing_item'] == item_index - - self.navi['route'].append({'mode': mode, - 'params': params, - 'last_listing_item': 0}) + self.navi['route'].append({'mode': mode, + 'params': params, + 'last_listing_item': 0}) self.right_menu(mode if not right_menu else right_menu) self.listing.reset() + def set_focus(self, mode): + if mode and not self.listing.size() and hasattr(self, "button_" + mode): + self.setFocus(getattr(self, "button_" + mode)) + else: + self.setFocus(self.listing) + def search(self, params = {}): log('search init params: ' + str(params)) self.navi_route('search', params) @@ -351,6 +354,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): items = db.get_all() favlist = [(1, '[B]%s[/B]'), (0, '%s')] last_listing_item = 0 + last_addtime_fav = False if items: for favbool, bbstring in favlist: for addtime, string, fav in items: @@ -359,14 +363,18 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if int(fav) == 1: img = __root__ + '/icons/fav.png' - last_listing_item += 1 + if str(self.navi['last_addtime']) == str(addtime): + last_addtime_fav = True + if not last_addtime_fav: + last_listing_item += 1 else: img = __root__ + '/icons/unfav.png' link = {'mode': 'history_item', 'query': title, 'addtime': str(addtime), 'fav': str(fav)} self.drawItem(bbstring % title, link, img) - self.navi['route'][-1]['last_listing_item'] = last_listing_item + self.route['last_listing_item'] = last_listing_item + self.navi_save('history') def history_action(self, action, addtime, fav): db = HistoryDB() @@ -382,7 +390,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): db.unfav(addtime) showMessage(self.localize('Favourites'), self.localize('Deleted!')) - self.history() + self.navi_restore() def watched(self, params = {}): self.navi_route('watched', params) @@ -411,6 +419,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): link = {'mode': 'watched_item', 'addtime': str(addtime)} self.drawItem(title, link, image=img) + self.navi_save('watched') def watched_action(self, action, addtime): db = WatchedHistoryDB() @@ -418,7 +427,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if action == 'delete': db.delete(addtime) showMessage(self.localize('Watched History'), self.localize('Deleted!')) - self.watched() + self.navi_restore() if action == 'open': filename, foldername, path, url, seek, length, ind = db.get('filename, foldername, path, url, seek, length, ind', 'addtime', str(addtime)) @@ -445,7 +454,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if action == 'clear': db.clear() showMessage(self.localize('Watched History'), self.localize('Clear!')) - self.watched() + self.navi_restore() def browser(self, params = {}): from resources.utorrent.net import Download @@ -481,7 +490,6 @@ class SearchWindow(pyxbmct.AddonDialogWindow): title = '[%s%%]%s%s [%s]' % (str(data['progress']), status, data['name'], str(data['ratio'])) menu.append( {"title": title, "image": img, "argv": {'mode': 'browser_item', 'hash': str(data['id'])}}) - elif not tdir: self.navi_route('browser', params, 'browser_subfolder') self.drawItem('..', {'mode': 'browser_moveup'}, image = 'DefaultFolderBack.png', isFolder = True) @@ -525,12 +533,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): folder = False self.drawItem(i['title'], params, image = img, isFolder = folder) - # def drawItem(self, title, params, image = None, isFolder = False): - if self.listing.size(): - self.setFocus(self.listing) - else: - self.setFocus(self.button_browser) - return + + self.navi_save('browser') def browser_action(self, hash, action, tdir = None, ind = None): from resources.utorrent.net import Download @@ -612,9 +616,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): return True def downloadstatus(self, params = {}): - self.listing.reset() - self.right_menu('downloadstatus') - #self.reconnect(pyxbmct.ACTION_NAV_BACK, self.history) + self.navi_route('downloadstatus', params) db = DownloadDB() items = db.get_all() @@ -656,11 +658,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.drawItem(title, params, image=img, isFolder=type == 'folder') # def drawItem(self, title, params, image = None, isFolder = False): - if self.listing.size(): - self.setFocus(self.listing) - else: - self.setFocus(self.button_downloadstatus) - return + + self.navi_save('downloadstatus') def downloadstatus_action(self, action, addtime, path, type, progress, storage): @@ -735,8 +734,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.downloadstatus() def file_browser(self, params): - - self.navi_route('browser', params) + self.navi_route('file_browser', params) get = params.get mode = get('mode') @@ -752,8 +750,6 @@ class SearchWindow(pyxbmct.AddonDialogWindow): xbmc.Player().play(localize_path(tdir)) self.close() else: - self.right_menu('file_browser') - #self.reconnect(pyxbmct.ACTION_NAV_BACK, self.downloadstatus) self.drawItem('..', {'mode': 'moveup', 'path': path, 'tdir': os.path.dirname(tdir)}, image = 'DefaultFolderBack.png', isFolder=True) @@ -768,10 +764,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): link = {'mode': 'file', 'path': path, 'type': 'file', 'tdir': os.path.join(tdir, file)} self.drawItem(file, link, isFolder=False) - if self.listing.size(): - self.setFocus(self.listing) - else: - self.setFocus(self.button_downloadstatus) + + self.navi_save('file_browser') def open_torrent(self, params): self.navi_route('open_torrent', params) @@ -806,7 +800,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): params = {'mode': 'torrent_play', 'url': identifier, 'url2': ids_video.rstrip(','), 'filename': link} self.drawItem(title, params) - self.navi_save() + self.navi_save('open_torrent') def get_menulist(self, mode): @@ -1181,11 +1175,11 @@ class InfoWindow(pyxbmct.AddonDialogWindow): def log(msg): try: - xbmc.log("### [%s]: %s" % (__plugin__, msg,), level=xbmc.LOGNOTICE) + xbmc.log("#SW# [%s]: %s" % (__plugin__, msg,), level=xbmc.LOGNOTICE) except UnicodeEncodeError: - xbmc.log("### [%s]: %s" % (__plugin__, msg.encode("utf-8", "ignore"),), level=xbmc.LOGNOTICE) + xbmc.log("#SW# [%s]: %s" % (__plugin__, msg.encode("utf-8", "ignore"),), level=xbmc.LOGNOTICE) except: - xbmc.log("### [%s]: %s" % (__plugin__, 'ERROR LOG',), level=xbmc.LOGNOTICE) + xbmc.log("#SW# [%s]: %s" % (__plugin__, 'ERROR LOG',), level=xbmc.LOGNOTICE) def titleMake(seeds, leechers, size, title): # AARRGGBB @@ -1210,7 +1204,6 @@ def dlstat_titleMake(title, second): title += '\r\n' + clDimgray % second return title - def main(params = None): dialog = SearchWindow(params) dialog.doModal() From aa4bd34d49986714455133de779eb00aa9b64c63 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sat, 31 Dec 2016 17:58:40 +0300 Subject: [PATCH 082/126] playstrm fix --- Core.py | 4 ++++ addon.xml | 2 +- searchwindow.py | 18 +++++++++--------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Core.py b/Core.py index 89c1de2..431fb59 100644 --- a/Core.py +++ b/Core.py @@ -1502,6 +1502,10 @@ class Core: fileIndex = unquote(get("index"), None) if url: self.__settings__.setSetting("lastTorrentUrl", url) + classMatch = re.search('(\w+)::(.+)', url) + if classMatch: + searcher = classMatch.group(1) + url = Searchers().downloadWithSearcher(classMatch.group(2), searcher) torrent = Downloader.Torrent(self.userStorageDirectory, torrentFilesDirectory=self.torrentFilesDirectory) self.__settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) if fileIndex==None: fileIndex = chooseFile(torrent.getContentList()) diff --git a/addon.xml b/addon.xml index fa8fcb3..c0cd2f5 100644 --- a/addon.xml +++ b/addon.xml @@ -8,7 +8,7 @@ - + video diff --git a/searchwindow.py b/searchwindow.py index d8900a8..86e23e5 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -156,14 +156,13 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def set_navigation(self): # Top menu - self.button_browser.setNavigation(self.listing, self.listing, self.button_downloadstatus, + self.button_browser.setNavigation(self.window_close_button, self.listing, self.button_downloadstatus, self.button_controlcenter) - self.button_controlcenter.setNavigation(self.listing, self.listing, self.button_browser, self.input_search) + self.button_controlcenter.setNavigation(self.window_close_button, self.listing, self.button_browser, self.input_search) #self.button_keyboard.setNavigation(self.listing, self.listing, self.button_browser, self.input_search) - self.input_search.setNavigation(self.listing, self.listing, self.button_controlcenter, self.button_search) - self.button_search.setNavigation(self.listing, self.listing, self.input_search, self.button_history) - self.button_history.setNavigation(self.listing, self.listing, self.button_search, self.button_watched) - + self.input_search.setNavigation(self.window_close_button, self.listing, self.button_controlcenter, self.button_search) + self.button_search.setNavigation(self.window_close_button, self.listing, self.input_search, self.button_history) + self.button_history.setNavigation(self.window_close_button, self.listing, self.button_search, self.button_watched) self.update_navigation() def update_navigation(self): @@ -173,10 +172,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.last_right_button = self.navi_right_menu[self.navi['last_right_button'] - 1] # Top menu - self.button_downloadstatus.setNavigation(self.listing, self.listing, self.last_right_button, + self.button_downloadstatus.setNavigation(self.window_close_button, self.listing, self.last_right_button, self.button_browser) - self.button_watched.setNavigation(self.listing, self.listing, self.button_history, self.last_right_button) - + self.button_watched.setNavigation(self.window_close_button, self.listing, self.button_history, self.last_right_button) + self.window_close_button.setNavigation(self.listing, self.last_top_button, self.button_watched, + self.button_downloadstatus) # Main self.listing.setNavigation(self.last_top_button, self.input_search, self.button_downloadstatus, self.last_right_button) From 9622dc9f67f216c3b59ae247e4a0fe0c11d4c197 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Thu, 5 Jan 2017 17:03:02 +0300 Subject: [PATCH 083/126] rutor --- Content.py | 2 + resources/contenters/RuTorOrg.py | 249 +++++++++++++++++++++++++++++++ 2 files changed, 251 insertions(+) create mode 100644 resources/contenters/RuTorOrg.py diff --git a/Content.py b/Content.py index 3ce544f..073b15d 100644 --- a/Content.py +++ b/Content.py @@ -220,6 +220,7 @@ class Content: ('>', '>'), ('"', '"'), ("'", '''), + ("'", '''), (' ', ' ',), ('"', '«', ), ('"', '»', ), @@ -227,6 +228,7 @@ class Content: ('e', 'é',), ('e', 'è',), ('&', '&',), + ('&', '&',), ('u', 'ù',), ('u', 'ú',), ('o', 'ô',), diff --git a/resources/contenters/RuTorOrg.py b/resources/contenters/RuTorOrg.py new file mode 100644 index 0000000..e5b58b5 --- /dev/null +++ b/resources/contenters/RuTorOrg.py @@ -0,0 +1,249 @@ +# -*- coding: utf-8 -*- +''' + Torrenter plugin for XBMC + Copyright (C) 2012 Vadim Skorba + vadim.skorba@gmail.com + + 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 . +''' +import re, sys + +import Content +from BeautifulSoup import BeautifulSoup + +#http://anti-tor.org/browse/0/1/0/0 date movie +#http://anti-tor.org/browse/1/1/0/0 page 2 +#http://anti-tor.org/browse/0/1/0/2 seed movie +# page/cat/?/sort + + +class RuTorOrg(Content.Content): + category_dict = { + 'movies': ('Movies', '/browse/0/1/0', + {'page': '/browse/%d/1/0', 'increase': 1, 'second_page': 1, + 'sort': [{'name': 'by Seeders', 'url_after': '/2'}, + {'name': 'by Date', 'url_after': '/0'}]}), + 'rus_movies': ('Russian Movies', '/browse/0/5/0', + {'page': '/browse/%d/5/0', 'increase': 1, 'second_page': 1, + 'sort': [{'name': 'by Seeders', 'url_after': '/2'}, + {'name': 'by Date', 'url_after': '/0'}]}), + 'tvshows': ('TV Shows', '/browse/0/4/0', + {'page': '/browse/%d/4/0', 'increase': 1, 'second_page': 1, + 'sort': [{'name': 'by Seeders', 'url_after': '/2'}, + {'name': 'by Date', 'url_after': '/0'}]}), + 'science': ('Научно - популярные фильмы', '/browse/0/12/0', + {'page': '/browse/%d/12/0', 'increase': 1, 'second_page': 1, + 'sort': [{'name': 'by Seeders', 'url_after': '/2'}, + {'name': 'by Date', 'url_after': '/0'}]}), + 'cartoons': ('Cartoons', '/browse/0/7/0', + {'page': '/browse/%d/7/0', 'increase': 1, 'second_page': 1, + 'sort': [{'name': 'by Seeders', 'url_after': '/2'}, + {'name': 'by Date', 'url_after': '/0'}]}), + 'anime': ('Anime', '/browse/0/10/0', + {'page': '/browse/%d/10/0', 'increase': 1, 'second_page': 1, + 'sort': [{'name': 'by Seeders', 'url_after': '/2'}, + {'name': 'by Date', 'url_after': '/0'}]}), + 'sport': ('Спорт и Здоровье', '/browse/0/13/0', + {'page': '/browse/%d/13/0', 'increase': 1, 'second_page': 1, + 'sort': [{'name': 'by Seeders', 'url_after': '/2'}, + {'name': 'by Date', 'url_after': '/0'}]}), + 'tele': ('Телевизор', '/browse/0/6/0', + {'page': '/browse/%d/6/0', 'increase': 1, 'second_page': 1, + 'sort': [{'name': 'by Seeders', 'url_after': '/2'}, + {'name': 'by Date', 'url_after': '/0'}]}), + 'humor': ('Юмор', '/browse/0/15/0', + {'page': '/browse/%d/15/0', 'increase': 1, 'second_page': 1, + 'sort': [{'name': 'by Seeders', 'url_after': '/2'}, + {'name': 'by Date', 'url_after': '/0'}]}), + } + + + #'hot': ('Most Recent',), + + + baseurl = "anti-tor.org" + + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 1 + + def isTracker(self): + return True + + def isSearcher(self): + return False + + def isScrappable(self): + return False + + def isInfoLink(self): + return True + + def isPages(self): + return True + + def isSort(self): + return True + + def isSearchOption(self): + return False + + def get_contentList(self, category, subcategory=None, apps_property=None): + self.debug = self.log + contentList = [] + url = 'http://%s' % self.get_url(category, subcategory, apps_property) + self.debug(url) + + self.headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://%s' % self.baseurl), ('Accept-encoding', 'gzip'), + ('Cookie', str(sys.modules["__main__"].__settings__.getSetting("rutor-auth")))] + + response = self.makeRequest(url, headers=self.headers) + + if None != response and 0 < len(response): + #self.debug(response) + cookie = re.compile("document.cookie='(.+?)';").findall(response) + if cookie and str(cookie[0]) != str(sys.modules["__main__"].__settings__.getSetting("rutor-auth")): + cookie = cookie[0] + self.log('ok found new cookie: ' + str(cookie)) + sys.modules["__main__"].__settings__.setSetting("rutor-auth", cookie) + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://%s' % self.baseurl), ('Accept-encoding', 'gzip'), + ('Cookie', str(sys.modules["__main__"].__settings__.getSetting("rutor-auth")))] + response = self.makeRequest(url, headers=headers) + self.debug(response) + + if category: + contentList = self.mode(response.decode('utf-8')) + self.debug(str(contentList)) + return contentList + + def mode(self, response): + contentList = [] + num = 101 + + + regex = '''.+?.+?(.+?).+?(\d*?\..+? .+?).+? (\d+).+?alt="L".+?> (\d+)' + for tr in re.compile(regex, re.DOTALL).findall(response): + result=re.compile(regex_tr, re.DOTALL).findall(tr) + if result: + self.debug(tr + ' -> ' + str(result[0])) + (date, link, infolink, title, size, seeds, leechers)=result[0] + # main + info = {} + num = num - 1 + original_title = None + year = 0 + img = '' + + # info + title = self.unescape(self.stripHtml(title.strip())) + info['label'] = info['title'] = title + + if link[0] == '/': link = 'http://%s%s' % (self.baseurl, link) + info['link'] = link + + #if infolink[0] == '/': infolink = 'http://%s%s' % (self.baseurl, infolink) + #info['infolink'] = infolink + + size = size.replace(' ', ' ') + date = date.replace(' ', ' ') + + info['plot'] = info['title'] + '\r\n[I](%s) [S/L: %s/%s] [/I]\r\n%s: %s' % ( + size, seeds, leechers, self.localize('Date'), date) + + #regex_title = '(.+?) / (.+?) \((\d\d\d\d)\)' + #regex_result = re.compile(regex_title, re.DOTALL).findall(title) + #if regex_result: + # title, original_title, year = regex_result[0] + # info['title'] = title + + contentList.append(( + int(int(self.sourceWeight) * (int(num))), + original_title, title, int(year), img, info, + )) + + return contentList + + def get_info(self, url): + self.debug = self.log + movieInfo = {} + color = '[COLOR blue]%s:[/COLOR] %s\r\n' + response = self.makeRequest(url, headers=self.headers) + + if None != response and 0 < len(response): + Soup = BeautifulSoup(response) + result = Soup.find('div', 'torrentMediaInfo') + if not result: + return None + li = result.findAll('li') + info, movieInfo = {'Cast': ''}, {'desc': '', 'poster': '', 'title': '', 'views': '0', 'rating': '50', + 'kinopoisk': ''} + try: + img = result.find('a', {'class': 'movieCover'}).find('img').get('src') + movieInfo['poster'] = img if img.startswith('http:') else 'http:' + img + except: + pass + try: + movie = re.compile('View all (.+?) episodes').match(str(result)) + if movie: + info['Movie'] = movie.group(1) + except: + pass + for i in li: + name = i.find('strong').text + if name: + info[name.rstrip(':')] = i.text.replace(name, '', 1) + plot = result.find('div', {'id': 'summary'}) + if plot: + cut = plot.find('strong').text + info['plot'] = plot.text.replace(cut, '', 1).replace('report summary', '') + # print str(result) + cast = re.compile('(.+?)').findall(str(result)) + if cast: + for actor in cast: + info['Cast'] += actor + ", " + if 'Genres' in info: + info['Genres'] = info['Genres'].replace(', ', ',').replace(',', ', ') + for key in info.keys(): + if not 'Movie' in info and info[key] == 'addto bookmarks': + movieInfo['title'] = self.unescape(key) + info['TV Show'] = self.unescape(key) + if not 'plot' in info and 'Summary' in key: + info['plot'] = info[key] + + for i in ['Movie', 'TV Show', 'Release date', 'Original run', 'Episode', 'Air date', 'Genres', 'Language', + 'Director', 'Writers', 'Cast', 'Original run', 'IMDb rating', 'AniDB rating']: + if info.get(i) and info.get(i) not in ['']: + movieInfo['desc'] += color % (i, info.get(i)) + if i == 'Movie': + movieInfo['title'] = info.get(i) + + for i in ['plot', 'IMDb link', 'RottenTomatoes']: + if info.get(i) and info.get(i) not in ['']: + if i == 'plot': + movieInfo['desc'] += '\r\n[COLOR blue]Plot:[/COLOR]\r\n' + self.unescape(info.get(i)) + if i == 'RottenTomatoes': + movieInfo['rating'] = str(info.get(i).split('%')[0]) + if i == 'IMDb link': + movieInfo['kinopoisk'] = 'http://imdb.snick.ru/ratefor/02/tt%s.png' % info.get(i) + + self.debug(str(movieInfo)) + return movieInfo From 94e02d116b947fe507e7d75362708d382697fdbe Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Fri, 6 Jan 2017 00:22:10 +0300 Subject: [PATCH 084/126] sw release --- .idea/workspace.xml | 3325 ++++++++++++++---------- AceStream.py | 3 +- Anteoloader.py | 4 +- Core.py | 175 +- Inposloader.py | 4 +- Localization.py | 2 + Player.py | 4 +- addon.xml | 2 +- changelog.txt | 3 + functions.py | 18 + resources/language/English/strings.xml | 6 + resources/settings.xml | 2 + searchwindow.py | 103 +- 13 files changed, 2234 insertions(+), 1417 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 05b9e70..dd8ecf9 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,8 +1,19 @@ - + + + + + + + + + + + + @@ -30,13 +41,13 @@ - + - + @@ -45,12 +56,14 @@ - - + + - - - + + + + + @@ -58,35 +71,361 @@ - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -95,355 +434,454 @@ - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + @@ -452,18 +890,19 @@ - - - - - - - - - - - - + + + + + + + + + + + + + @@ -481,36 +920,36 @@ - Torrenter Search Window - self.reconnect(pyxbmct.ACTION_NAV_BACK - last_listing_mode - last_action + navi_save last_link - last_right_buttons_count - right_buttons_count - playSTRM - set_resolved_url - Unable to rename torrent file from - self. - listitem - setAnimation - last_right_button - self.back - self.reconnect(pyxbmct.ACTION_NAV_BACK, self.history) - right_menu_set_label - navi_u - self.search( + self.last_right_button + self.last_top_button + navi_restore + traceback + self.filesList + self.navi_back + torrent_moveup + last_listing_item + self.navi['addtime'] + self.button_keyboard + back + route + if self.listing.size(): navi_route - navi_back - pyxbmct.ACTION_NAV_BACK - self.open_torrent - Fuck this! - .play - self.display_name - self.right_buttons_count - move - '..' - WINDOW_FULLSCREEN_VIDEO + rutor- + __main__ + url_after + log( + debug + torrentPlayer + json + onPlayBackStopped + play + xbmc.P + loadsw_onstop + setSetting + ettings__.setSetting('loadsw_onstop' + self.close pyxbmct.Button( @@ -521,6 +960,9 @@ action __settings__ get + self.navi['filesList'] + self.route + debug( @@ -534,9 +976,6 @@ @@ -610,6 +1052,7 @@ + @@ -625,7 +1068,6 @@ - @@ -638,14 +1080,14 @@ - - - - + + + + @@ -824,97 +1266,6 @@ @@ -1181,12 +1623,12 @@ - + - + @@ -1236,16 +1678,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1359,21 +1734,6 @@ - - - - - - - - - - - - - - - @@ -1381,20 +1741,6 @@ - - - - - - - - - - - - - - @@ -1433,21 +1779,6 @@ - - - - - - - - - - - - - - - @@ -1470,28 +1801,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -1499,299 +1808,872 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1799,410 +2681,231 @@ - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AceStream.py b/AceStream.py index dda3cfc..4c91f2b 100644 --- a/AceStream.py +++ b/AceStream.py @@ -28,7 +28,7 @@ from StringIO import StringIO import zlib from functions import file_decode, file_encode -from functions import magnet_alert, log, debug +from functions import magnet_alert, log, loadsw_onstop import xbmcvfs @@ -81,6 +81,7 @@ class AceStream: def __exit__(self): self.TSplayer.end() + loadsw_onstop() # Reload Search Window def play_url_ind(self, ind, label, icon): self.TSplayer.play_url_ind(int(ind), label, str(icon), '') diff --git a/Anteoloader.py b/Anteoloader.py index b1676ab..3863849 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -30,7 +30,7 @@ import xbmcgui import xbmcvfs import xbmcaddon import Localization -from functions import localize_path, isSubtitle, DownloadDB, log, debug, is_writable, unquote, file_url +from functions import localize_path, isSubtitle, loadsw_onstop, is_writable, file_url import os @@ -326,6 +326,8 @@ class AnteoPlayer(xbmc.Player): xbmc.Player().stop() + loadsw_onstop() # Reload Search Window + if '1' != self.__settings__.getSetting("keep_files") and 'Saved Files' not in self.userStorageDirectory: xbmc.sleep(1000) clearStorage(self.userStorageDirectory) diff --git a/Core.py b/Core.py index 431fb59..9921556 100644 --- a/Core.py +++ b/Core.py @@ -39,6 +39,7 @@ class Core: language = {0: 'en', 1: 'ru', 2: 'uk', 3: 'he', 4: 'hu'}.get(int(__settings__.getSetting("language"))) scrapperDB_ver = {'en':'1.1', 'ru':'1.3', 'he':'1.3'} torrent_info_style = int(__settings__.getSetting('torrent_info_style')) + searchwindowmode = int(__settings__.getSetting('searchwindowmode')) log('SYS ARGV: ' + str(sys.argv)) @@ -53,7 +54,8 @@ class Core: def sectionMenu(self): if self.__settings__.getSetting('plugin_name') != self.__plugin__: #Every update run - first_run_250() + first_run_260() + self.__settings__.setSetting('first_run_260', 'True') self.__settings__.setSetting('plugin_name', self.__plugin__) #check_network_advancedsettings() check_download_dir() @@ -65,52 +67,100 @@ class Core: contextMenu = [(self.localize('Search Control Window'), 'xbmc.RunScript(%s,)' % os.path.join(ROOT, 'controlcenter.py'))] - self.drawItem('< %s >' % self.localize('Search Window') + ' (BETA)', 'searchWindow', - image=self.ROOT + '/icons/kodi.png', isFolder=False) + #Search Window + if self.searchwindowmode < 3: + self.drawItem('< %s >' % self.localize('Search Window'), 'searchWindow', + image=self.ROOT + '/icons/kodi.png', isFolder=False) - if self.history_bool: - HistorycontextMenu=[] + #History + if self.history_bool and self.searchwindowmode > 0: + HistorycontextMenu = [] HistorycontextMenu.extend(contextMenu) HistorycontextMenu.append( - (self.localize('Clear %s') % self.localize('Search History'), ListString % ('History', 'clear', 'addtime', ''))) - self.drawItem('< %s >' % self.localize('Search History'), 'History', - image=self.ROOT + '/icons/history2.png', contextMenu=HistorycontextMenu, replaceMenu=False) - self.drawItem('< %s >' % self.localize('Search'), 'search', image=self.ROOT + '/icons/search.png', ) + (self.localize('Clear %s') % self.localize('Search History'), + ListString % ('History', 'clear', 'addtime', ''))) + if self.searchwindowmode == 1: + self.drawItem('< %s >' % self.localize('Search History'), 'swHistory', + image=self.ROOT + '/icons/history2.png', contextMenu=HistorycontextMenu, replaceMenu=False) + else: + self.drawItem('< %s >' % self.localize('Search History'), 'History', + image=self.ROOT + '/icons/history2.png', contextMenu=HistorycontextMenu, replaceMenu=False) + + #Search + if self.searchwindowmode == 1: + self.drawItem('< %s >' % self.localize('Search'), 'swsearch', image=self.ROOT + '/icons/search.png',) + elif self.searchwindowmode > 1: + self.drawItem('< %s >' % self.localize('Search'), 'search', image=self.ROOT + '/icons/search.png', ) + + #Media CLcontextMenu=[] CLcontextMenu.extend(contextMenu) CLcontextMenu.append((self.localize('Reset All Cache DBs'), ListString % ('full_download', '', 'url', json.dumps({'action': 'delete'})))) self.drawItem('< %s >' % self.localize('Content Lists'), 'openContent', image=self.ROOT + '/icons/media.png', contextMenu=CLcontextMenu, replaceMenu=False) + + #DL Status DLScontextMenu=[(self.localize('Start All'), ListString % ('DownloadStatus', 'startall', 'addtime', '')), (self.localize('Stop All'), ListString % ('DownloadStatus', 'stopall', 'addtime', '')),] DLScontextMenu.append( (self.localize('Clear %s') % self.localize('Download Status'), ListString % ('DownloadStatus', 'clear', 'addtime', ''))) DLScontextMenu.extend(contextMenu) - self.drawItem('< %s >' % self.localize('Download Status'), 'DownloadStatus', image=self.ROOT + '/icons/download.png', - contextMenu=DLScontextMenu, replaceMenu=False) - self.drawItem('< %s >' % self.localize('Torrent-client Browser'), 'uTorrentBrowser', - image=self.ROOT + '/icons/' + getTorrentClientIcon()) - if self.history_bool: + + if self.searchwindowmode == 1: + self.drawItem('< %s >' % self.localize('Download Status'), 'swDownloadStatus', + image=self.ROOT + '/icons/download.png', + contextMenu=DLScontextMenu, replaceMenu=False) + elif self.searchwindowmode > 1: + self.drawItem('< %s >' % self.localize('Download Status'), 'DownloadStatus', + image=self.ROOT + '/icons/download.png', + contextMenu=DLScontextMenu, replaceMenu=False) + + #Torrent-client + if self.searchwindowmode == 1: + self.drawItem('< %s >' % self.localize('Torrent-client Browser'), 'swuTorrentBrowser', + image=self.ROOT + '/icons/' + getTorrentClientIcon()) + elif self.searchwindowmode > 1: + self.drawItem('< %s >' % self.localize('Torrent-client Browser'), 'uTorrentBrowser', + image=self.ROOT + '/icons/' + getTorrentClientIcon()) + + #Watched + if self.history_bool and self.searchwindowmode > 0: WatchedHistorycontextMenu=[] WatchedHistorycontextMenu.extend(contextMenu) WatchedHistorycontextMenu.append( (self.localize('Clear %s') % self.localize('Watched History'), ListString % ('WatchedHistory', 'clear', 'addtime', ''))) - self.drawItem('< %s >' % self.localize('Watched History'), 'WatchedHistory', - image=self.ROOT + '/icons/watched.png', contextMenu=WatchedHistorycontextMenu, replaceMenu=False) + if self.searchwindowmode == 1: + self.drawItem('< %s >' % self.localize('Watched History'), 'swWatchedHistory', + image=self.ROOT + '/icons/watched.png', contextMenu=WatchedHistorycontextMenu, + replaceMenu=False) + else: + self.drawItem('< %s >' % self.localize('Watched History'), 'WatchedHistory', + image=self.ROOT + '/icons/watched.png', contextMenu=WatchedHistorycontextMenu, + replaceMenu=False) + + #Torr player self.drawItem('< %s >' % self.localize('.torrent Player'), 'torrentPlayer', - image=self.ROOT + '/icons/torrentPlayer.png') + image=self.ROOT + '/icons/torrentPlayer.png', isFolder = False) + + #Search Control Window self.drawItem('< %s >' % self.localize('Search Control Window'), 'controlCenter', image=self.ROOT + '/icons/settings.png', isFolder=False) + + #Magnet player self.drawItem('< %s >' % self.localize('Magnet-link Player'), 'magentPlayer', - image=self.ROOT + '/icons/magnet.png') + image=self.ROOT + '/icons/magnet.png', isFolder = False) + + #Debug if self.debug: self.drawItem('full_download', 'full_download', image=self.ROOT + '/icons/magnet.png') self.drawItem('test', 'test', image=self.ROOT + '/icons/magnet.png', isFolder=False) + #Clear storage if '0' != self.__settings__.getSetting("keep_files"): self.drawItem('< %s >' % self.localize('Clear Storage'), 'clearStorage', isFolder=True, image=self.ROOT + '/icons/clear.png') + view_style('sectionMenu') xbmcplugin.endOfDirectory(handle=int(sys.argv[1]), succeeded=True) @@ -243,54 +293,43 @@ class Core: lockView('wide') def test(self, params={}): - #from Anteoloader import AnteoPlayer - #from python_libtorrent import get_libtorrent - #self.lt=get_libtorrent() - #self.torrentFile='D:\\test.torrent' - #self.session = self.lt.session() - #e=self.lt.bdecode(xbmcvfs.File(self.torrentFile,'rb').read()) - #self.torrentFileInfo = self.lt.torrent_info(e) - #torrent_info={'ti': self.torrentFileInfo, - # 'save_path': self.userStorageDirectory, - # 'flags': 0x300, - # #'storage_mode': self.lt.storage_mode_t(1), - # 'paused': False, - # #'auto_managed': False, - # #'duplicate_is_error': True - # } - #self.torrentHandle = self.session.add_torrent(torrent_info) - #log(self.torrentHandle.torrent_file()) - #self.session.remove_torrent(self.torrentHandle) + import searchwindow + params = {'mode': 'file_browser', 'path':'D:\\', 'tdir':'D:\\FRAPS\\'} + searchwindow.main(params) - #params['url']='0' - #if not xbmcvfs.exists(torrentUrl): - # action = xbmcgui.Dialog() - # torrentUrl = action.browse(1, self.localize('Choose .torrent in video library'), 'video', '.torrent') - #if torrentUrl and xbmcvfs.exists(torrentUrl): - # if 0 != len(torrentUrl): - # self.Downloader = Downloader.Torrent(self.userStorageDirectory, torrentUrl) - # else: - # log(self.__plugin__ + " Unexpected access to method Anteoloader() without torrent content") - #if self.Downloader: - # x=self.Downloader.getContentList() - # print str(x) - # xbmc.sleep(1000) - # self.Downloader.__exit__() - #self.Player = AnteoPlayer(userStorageDirectory=self.userStorageDirectory, torrentUrl=torrentUrl, params=params) + def swHistory(self, params={}): + import searchwindow + params = {'mode': 'history'} + searchwindow.main(params) + + def swDownloadStatus(self, params={}): + import searchwindow + params = {'mode': 'downloadstatus'} + searchwindow.main(params) + + def swuTorrentBrowser(self, params={}): + import searchwindow + params = {'mode': 'browser'} + searchwindow.main(params) + + def swWatchedHistory(self, params={}): + import searchwindow + params = {'mode': 'watched'} + searchwindow.main(params) + + + def swsearch(self, params={}): + if len(Searchers().get_active())<1: + noActiveSerachers() + return + keyboard = xbmc.Keyboard('', self.localize('Search Phrase')) + keyboard.doModal() + params["query"] = keyboard.getText() + if keyboard.isConfirmed(): + params["mode"] = 'search' + import searchwindow + searchwindow.main(params) - #xbmcgui.Dialog().ok('Dam Son!','Now send this shit to DiMartino') - from resources.proxy import antizapret - filename = os.path.join(tempdir(),"antizapret.pac_config") - import shelve - from contextlib import contextmanager, closing - with closing(shelve.open(filename, writeback=True)) as d: - import time - log(str(d)) - log(str(time.time())) - log(str((time.time() - d["created_at"]))) - ttl = 24*3600 - if ttl > 0 and (time.time() - d["created_at"]) > ttl: - log('xxx') def DownloadStatus(self, params={}): db = DownloadDB() @@ -1382,7 +1421,6 @@ class Core: params["url"] = urllib.quote_plus(unescape(urllib.unquote_plus(query))) else: params["url"] = urllib.quote_plus(unescape(urllib.unquote_plus(defaultKeyword))) - #print str(params) self.torrentPlayer(params) def torrentPlayer(self, params={}): @@ -1403,7 +1441,12 @@ class Core: % ('torrentPlayer', url)) return if url: - self.openTorrent(params) + if self.searchwindowmode > 1: + self.openTorrent(params) + else: + import searchwindow + params = {'mode': 'open_torrent', 'link': url} + searchwindow.main(params) def userStorage(self, params): save=False diff --git a/Inposloader.py b/Inposloader.py index a07f919..e30125d 100644 --- a/Inposloader.py +++ b/Inposloader.py @@ -30,7 +30,7 @@ import xbmcvfs import xbmcaddon import xbmcplugin import Localization -from functions import encode_msg, isSubtitle, is_writable, file_url, localize_path +from functions import loadsw_onstop, isSubtitle, is_writable, file_url, localize_path import os @@ -301,6 +301,8 @@ class InposPlayer(xbmc.Player): xbmc.Player().stop() + loadsw_onstop() # Reload Search Window + if '1' != self.__settings__.getSetting("keep_files") and 'Saved Files' not in self.userStorageDirectory: xbmc.sleep(1000) clearStorage(self.userStorageDirectory) diff --git a/Localization.py b/Localization.py index 39a3b0a..fb92526 100644 --- a/Localization.py +++ b/Localization.py @@ -809,6 +809,8 @@ def localize(text): 'Play (from start)':'Lejátszás (az elejétől)', }, 'ru': { + 'is recommended for Kodi 17 users and now out of beta.': 'рекомендовано пользователям Kodi 17 и вышло из беты.', + 'You can disable it usage in Settings.':'Его можно отключить в настройках плагина.', 'Move Up': 'Вверх', 'Torrenter Search Window': 'Окно Поиска Torrenter', 'Cancel': 'Отмена', diff --git a/Player.py b/Player.py index 62a3935..835197b 100644 --- a/Player.py +++ b/Player.py @@ -30,7 +30,7 @@ import Downloader import xbmcgui import xbmcvfs import Localization -from functions import calculate, showMessage, clearStorage, WatchedHistoryDB, DownloadDB, get_ids_video, log, debug, foldername, ensure_str +from functions import calculate, showMessage, clearStorage, WatchedHistoryDB, DownloadDB, get_ids_video, log, debug, foldername, ensure_str, loadsw_onstop ROOT = sys.modules["__main__"].__root__ RESOURCES_PATH = os.path.join(ROOT, 'resources') @@ -184,6 +184,8 @@ class TorrentPlayer(xbmc.Player): debug('************************************* NO! break') break + loadsw_onstop() # Reload Search Window + self.torrent.stopSession() self.torrent.threadComplete = True self.torrent.checkThread() diff --git a/addon.xml b/addon.xml index c0cd2f5..657ce7b 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index a757435..41488c5 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,8 @@ English changelog at http://bit.ly/1MfSVUP +[B]Version 2.5.6[/B] +[+] Списки Медиа: Добавлен RuTorOrg + [B]Version 2.5.5[/B] [+] Control Center: Исправлена работа выбора трекеров для определенного запроса [+] Торрент-клиент: При скачивании одного файла торрент-клиентом теперь автоматически выбирается раздача diff --git a/functions.py b/functions.py index 846d037..c72e562 100644 --- a/functions.py +++ b/functions.py @@ -1870,6 +1870,18 @@ def first_run_250(): #ok = xbmcgui.Dialog().ok('< %s >' % (Localization.localize('Torrenter Update ') + '2.4.2'), # Localization.localize('Torrent2HTTP enabled! Can be changed in Settings.')) +def first_run_260(): + if not __settings__.getSetting('first_run_260') == 'True': + yes=xbmcgui.Dialog().yesno('< %s >' % (Localization.localize('Torrenter Update ') + '2.6.0'), + Localization.localize('Torrenter Search Window')+' ' + +Localization.localize('is recommended for Kodi 17 users and now out of beta.') + +Localization.localize('You can disable it usage in Settings.'), + Localization.localize('Would you like to try it?'),) + if yes: + import searchwindow + searchwindow.main() + + def seeking_warning(seek): if __settings__.getSetting('torrent_player')!='1': seek_point = '%02d:%02d:%02d' % ((seek / (60*60)), (seek / 60) % 60, seek % 60) @@ -2266,3 +2278,9 @@ def get_item(): item.setInfo(type='Video', infoLabels=infoLabels) return item + +def loadsw_onstop(): + if __settings__.getSetting('loadsw_onstop') == 'true': + import searchwindow + params = {'mode': 'load'} + searchwindow.main(params) diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index ad58650..895544e 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -79,6 +79,12 @@ Advanced Torrent-client Hentai (fine-tuning) + Search Window Mode + Enabled, hide old style + Enabled, replace old style + Enabled, optional + Disabled + Search Window Transparent Background Save path Call dialog Default diff --git a/resources/settings.xml b/resources/settings.xml index 3dfbcf9..fa7d48b 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -6,6 +6,7 @@ + @@ -72,5 +73,6 @@ + diff --git a/searchwindow.py b/searchwindow.py index 86e23e5..59505aa 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -21,7 +21,7 @@ import pyxbmct.addonwindow as pyxbmct import xbmcaddon import xbmcgui import xbmcvfs -import json +import xbmc from functions import * @@ -49,7 +49,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): last_top_button = None last_right_button = None last_listing_mode = None - route = None + route = {} count = 0 navi_right_menu = [] navi_top_menu = [] @@ -60,6 +60,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def __init__(self, params = None): log('SearchWindow init params: '+str(params)) super(SearchWindow, self).__init__(self.localize('Torrenter Search Window')) + __settings__.setSetting('loadsw_onstop', 'false') self.setGeometry(1280, 720, 9, 16) self.set_navi() self.set_controls() @@ -69,9 +70,20 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.navi_load() elif params.get('mode') == 'search': self.search(params) + elif params.get('mode') == 'history': + self.history() + elif params.get('mode') == 'downloadstatus': + self.downloadstatus() + elif params.get('mode') == 'browser': + self.browser() + elif params.get('mode') == 'watched': + self.watched() + elif params.get('mode') == 'open_torrent': + self.open_torrent(params) + elif params.get('mode') == 'file_browser': + self.file_browser(params) else: self.navi_load() - #self.history() def set_navi(self): self.navi = { @@ -87,11 +99,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): } def set_controls(self): - if not __settings__.getSetting('debug') == 'true': + if not __settings__.getSetting('sw_transparent_back') == 'true': self.background.setImage('%s/icons/%s.png' % (__root__, 'ContentPanel')) - #self.background.setImage('%s/icons/%s.png' % (__root__, 'ContentPanel')) - # Top menu self.button_downloadstatus = pyxbmct.Button("", focusTexture=self.icon % 'fdownloadstatus', @@ -187,20 +197,20 @@ class SearchWindow(pyxbmct.AddonDialogWindow): ('WindowClose', 'effect=fade start=100 end=0 time=500',)]) def navi_back(self): - log('navi_back init') + debug('navi_back init') self.navi['route'].pop(-1) self.navi_restore() def navi_route_reset(self): - log('navi_route_reset init') + debug('navi_route_reset init') self.navi['route'] = [self.navi['route'][0]] def navi_route_pop(self): - log('navi_route_pop init') + debug('navi_route_pop init') self.navi['route'].pop(-1) def navi_restore(self): - log('navi_restore init') + debug('navi_restore init') self.route = self.navi['route'].pop(-1) action = getattr(self, self.route['mode']) try: @@ -211,17 +221,17 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.set_focus(self.route['mode']) - log('self.route[last_listing_item]: ' + str(self.route['last_listing_item'])) + debug('self.route[last_listing_item]: ' + str(self.route['last_listing_item'])) if self.route['last_listing_item'] > 0: self.listing.selectItem(self.route['last_listing_item']) except: import traceback - log('navi_restore ERROR '+traceback.format_exc()) + debug('navi_restore ERROR '+traceback.format_exc()) self.set_navi() self.history() def navi_load(self): - log('navi_load init') + debug('navi_load init') __tmppath__ = os.path.join(xbmc.translatePath('special://temp'), 'xbmcup', 'plugin.video.torrenter') if not xbmcvfs.exists(__tmppath__): xbmcvfs.mkdirs(__tmppath__) @@ -230,14 +240,15 @@ class SearchWindow(pyxbmct.AddonDialogWindow): navi = read.read() read.close() - log('navi_load navi: '+str(navi)) + debug('navi_load navi: '+str(navi)) + log('navi_load navi: ' + str(navi['route'])) if navi and len(navi) > 0: self.navi = json.loads(navi) self.navi_restore() def navi_save(self, mode = None): - log('navi_save init') + debug('navi_save init') if mode: self.set_focus(mode) @@ -252,23 +263,23 @@ class SearchWindow(pyxbmct.AddonDialogWindow): write.close() def navi_update(self): - log('navi_update init') + debug('navi_update init') try: focused_control = self.getFocus() except: focused_control = None debug('start navi_update' + str(focused_control)) - log(str(self.navi['route'])) + debug(str(self.navi['route'])) if focused_control == self.listing: item_index = self.listing.getSelectedPosition() self.navi['route'][-1]['last_listing_item'] = item_index - log('self.listing getSelectedPosition ' + str(item_index)) + debug('self.listing getSelectedPosition ' + str(item_index)) item = self.listing.getSelectedItem() params = json.loads(item.getfilename()) mode = params.get('mode') - log('navi_update:' + str(mode)) + debug('navi_update:' + str(mode)) if self.last_listing_mode != mode: self.last_listing_mode = mode debug('set_menulist navi_update:' + str(mode)) @@ -284,17 +295,17 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.update_navigation() def navi_route(self, mode, params = {}, right_menu = None): - log('navi_route init') + debug('navi_route init') try: focused_control = self.getFocus() except: focused_control = None if focused_control in self.navi_top_menu: - log('focused_control in self.navi[\'top_menu\']') + debug('focused_control in self.navi[\'top_menu\']') self.navi_route_reset() - log('***** self.navi[\'route\'].append *****' + str(mode) + str(params)) + debug('***** self.navi[\'route\'].append *****' + str(mode) + str(params)) self.navi['route'].append({'mode': mode, 'params': params, @@ -304,8 +315,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.listing.reset() def set_focus(self, mode): - if mode and not self.listing.size() and hasattr(self, "button_" + mode): - self.setFocus(getattr(self, "button_" + mode)) + if not self.listing.size(): + if mode and hasattr(self, "button_" + mode): + self.setFocus(getattr(self, "button_" + mode)) + else: + self.setFocus(self.input_search) else: self.setFocus(self.listing) @@ -316,7 +330,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): get = params.get addtime = get('addtime') query = get('query') - route = self.navi['route'][-1] + self.route = self.navi['route'][-1] if query: self.input_search.setText(query) @@ -331,10 +345,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): searchersList = get_searchersList(addtime) # cache - route['params']['query'] = query + self.route['params']['query'] = query if (query != self.navi['last_query'] or self.navi['searchersList'] != searchersList) and len(query) > 0: self.navi['filesList'] = get_filesList(query, searchersList, addtime) - route['params']['addtime'] = addtime + self.route['params']['addtime'] = addtime self.navi['last_addtime'] = addtime self.navi['searchersList'] = searchersList self.navi['last_query'] = query @@ -449,6 +463,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): torrent = Downloader.Torrent(self.userStorageDirectory, torrentFilesDirectory=self.torrentFilesDirectory) __settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) xbmc.executebuiltin('xbmc.RunPlugin("plugin://plugin.video.torrenter/?action=playTorrent&url='+str(ind)+'&seek='+str(seek)+'")') + __settings__.setSetting('loadsw_onstop', 'true') self.close() if action == 'clear': @@ -574,7 +589,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): filename = data[0] break filename = os.path.join(folder, filename) - xbmc.executebuiltin('xbmc.PlayMedia("' + filename.encode('utf-8') + '")') + self.file_play(filename) elif tdir and action == 'copy': path = os.path.join(folder, tdir) dirs, files = xbmcvfs.listdir(path) @@ -744,13 +759,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): path = encode_msg(path) tdir = encode_msg(tdir) - if tdir == os.path.dirname(path): + if mode == 'moveup' and tdir == os.path.dirname(path): self.downloadstatus() elif mode == 'file': - xbmc.Player().play(localize_path(tdir)) - self.close() + swPlayer().play(localize_path(tdir)) else: - self.drawItem('..', {'mode': 'moveup', 'path': path, 'tdir': os.path.dirname(tdir)}, image = 'DefaultFolderBack.png', isFolder=True) @@ -767,6 +780,10 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.navi_save('file_browser') + def file_play(self, file): + self.close() + swPlayer().play(item = file) + def open_torrent(self, params): self.navi_route('open_torrent', params) @@ -1013,6 +1030,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if index == 1: url = self.form_link('playTorrent', params) xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + __settings__.setSetting('loadsw_onstop', 'true') self.close() elif index == 2: action = 'downloadFilesList' @@ -1066,9 +1084,6 @@ class SearchWindow(pyxbmct.AddonDialogWindow): elif index == 3: action = '0' self.browser_action(hash, action, tdir = tdir, ind = ind) - - if index == 1: - self.close() elif mode in ['downloadstatus', 'downloadstatus_subfolder', 'downloadstatus_file']: if index == 1: action = 'play' elif index == 2: action = 'start' @@ -1210,6 +1225,24 @@ def main(params = None): del dialog # You need to delete your instance when it is no longer needed # because underlying xbmcgui classes are not grabage-collected. +class swPlayer(xbmc.Player): + def play(self, item): + xbmc.Player().play(item = item) + i = 0 + while not self.isPlaying() and i < 100: + i += 1 + xbmc.sleep(500) + log('swPlayer not started '+str(i)) + + if i > 99: + return False + else: + while not xbmc.abortRequested and self.isPlaying(): + xbmc.sleep(500) + log('swPlayer playing') + + params = {'mode': 'load'} + main(params) if __name__ == '__main__': try: From 4223c6d9420d632854370b95354f7ccee78092ca Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sat, 7 Jan 2017 14:39:57 +0300 Subject: [PATCH 085/126] some really shady shit --- Anteoloader.py | 11 +++++++---- Core.py | 7 +++++-- Inposloader.py | 11 +++++++---- Player.py | 16 +++++++++------ changelog.txt | 5 +++++ functions.py | 12 ++++++++---- resources/language/English/strings.xml | 1 + resources/language/Russian/strings.xml | 7 +++++++ resources/settings.xml | 1 + searchwindow.py | 27 +++++++++++++++++++------- 10 files changed, 71 insertions(+), 27 deletions(-) diff --git a/Anteoloader.py b/Anteoloader.py index 3863849..d4ae9f6 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -302,6 +302,9 @@ class AnteoPlayer(xbmc.Player): if self.buffer(): log('[AnteoPlayer]: ************************************* GOING LOOP') if self.setup_play(): + WatchedHistoryDB().add(self.basename, + foldername(self.getContentList()[self.contentId]['title']), + self.watchedTime, self.totalTime, self.contentId, self.fullSize) self.setup_subs() self.loop() WatchedHistoryDB().add(self.basename, foldername(self.getContentList()[self.contentId]['title']), self.watchedTime, self.totalTime, self.contentId, self.fullSize) @@ -321,19 +324,19 @@ class AnteoPlayer(xbmc.Player): log('[AnteoPlayer]: ************************************* NO! break') showMessage(self.localize('Information'), - self.localize('Stopping the torrent2http process...'), forced=True) + self.localize('Stopping the torrent2http process...')) break xbmc.Player().stop() - loadsw_onstop() # Reload Search Window - if '1' != self.__settings__.getSetting("keep_files") and 'Saved Files' not in self.userStorageDirectory: xbmc.sleep(1000) clearStorage(self.userStorageDirectory) showMessage(self.localize('Information'), - self.localize('torrent2http process stopped.'), forced=True) + self.localize('torrent2http process stopped.')) + + loadsw_onstop() # Reload Search Window def init(self): self.next_contentId = False diff --git a/Core.py b/Core.py index 9921556..ff8189d 100644 --- a/Core.py +++ b/Core.py @@ -1473,7 +1473,10 @@ class Core: self.userStorageDirectory=dirname def playTorrent(self, params={}): - torrentUrl = self.__settings__.getSetting("lastTorrent") + if params.get('filename'): + torrentUrl = params.get('filename') + else: + torrentUrl = self.__settings__.getSetting("lastTorrent") #xbmc.executebuiltin('Action(Stop)') self.userStorage(params) if self.torrent_player == '0': @@ -1608,7 +1611,7 @@ class Core: 'XBMC.RunPlugin(%s)' % ('%s?action=%s&ind=%s') % ( sys.argv[0], 'downloadLibtorrent', str(identifier))), ] - link = {'url': identifier, 'thumbnail': thumbnail, 'save_folder':save_folder} + link = {'url': identifier, 'thumbnail': thumbnail, 'save_folder':save_folder, 'filename':url} self.drawItem(title, 'playTorrent', link, image=thumbnail, isFolder=False, action2=ids_video.rstrip(','), contextMenu=contextMenu, replaceMenu=False, fileSize=filesize) view_style('openTorrent') diff --git a/Inposloader.py b/Inposloader.py index e30125d..b9c6128 100644 --- a/Inposloader.py +++ b/Inposloader.py @@ -273,6 +273,9 @@ class InposPlayer(xbmc.Player): while True: log('['+author+'Player]: ************************************* GOING LOOP') if self.setup_play(): + WatchedHistoryDB().add(self.basename, + foldername(self.getContentList()[self.contentId]['title']), + self.watchedTime, self.totalTime, self.contentId, self.fullSize) self.setup_subs() self.loop() WatchedHistoryDB().add(self.basename, foldername(self.getContentList()[self.contentId]['title']), self.watchedTime, self.totalTime, self.contentId, self.fullSize) @@ -301,8 +304,6 @@ class InposPlayer(xbmc.Player): xbmc.Player().stop() - loadsw_onstop() # Reload Search Window - if '1' != self.__settings__.getSetting("keep_files") and 'Saved Files' not in self.userStorageDirectory: xbmc.sleep(1000) clearStorage(self.userStorageDirectory) @@ -313,7 +314,9 @@ class InposPlayer(xbmc.Player): #else: #if self.seeding: self.db_delete() showMessage(self.localize('Information'), - self.localize('Torrent downloading is stopped.'), forced=True) + self.localize('Torrent downloading is stopped.')) + + loadsw_onstop() # Reload Search Window def init(self): self.next_contentId = False @@ -572,7 +575,7 @@ class InposPlayer(xbmc.Player): int) and self.next_contentId != False: self.engine.activate_file(self.next_contentId) showMessage(self.localize('Torrent Downloading'), - self.localize('Starting download next episode!'), forced=True) + self.localize('Starting download next episode!')) log('[loop]: next_contentId '+str(self.next_contentId)+str(isinstance(self.next_contentId, int))) file_status = self.engine.file_status(self.next_contentId) self.basename = self.display_name = os.path.basename(file_status.name) diff --git a/Player.py b/Player.py index 835197b..bf5c180 100644 --- a/Player.py +++ b/Player.py @@ -166,6 +166,10 @@ class TorrentPlayer(xbmc.Player): debug('************************************* GOING LOOP') self.torrent.startSession() self.torrent.continueSession(self.contentId) + WatchedHistoryDB().add(self.basename, + foldername(self.torrent.getContentList()[self.contentId]['title']), + self.watchedTime, self.totalTime, self.contentId, + self.fullSize / 1024 / 1024) self.loop() WatchedHistoryDB().add(self.basename, foldername(self.torrent.getContentList()[self.contentId]['title']), self.watchedTime, self.totalTime, self.contentId, self.fullSize / 1024 / 1024) else: @@ -184,8 +188,6 @@ class TorrentPlayer(xbmc.Player): debug('************************************* NO! break') break - loadsw_onstop() # Reload Search Window - self.torrent.stopSession() self.torrent.threadComplete = True self.torrent.checkThread() @@ -195,11 +197,13 @@ class TorrentPlayer(xbmc.Player): else: if self.seeding_status: showMessage(self.localize('Information'), - self.localize('Torrent is seeding. To stop it use Download Status.'), forced=True) + self.localize('Torrent is seeding. To stop it use Download Status.')) else: if self.seeding: self.db_delete() showMessage(self.localize('Information'), - self.localize('Torrent downloading is stopped.'), forced=True) + self.localize('Torrent downloading is stopped.')) + + loadsw_onstop() # Reload Search Window def init(self): self.next_dl = True if self.__settings__.getSetting('next_dl') == 'true' and self.ids_video else False @@ -369,7 +373,7 @@ class TorrentPlayer(xbmc.Player): if len(subs) > 0: self.torrent.startSession() showMessage(self.localize('Information'), - self.localize('Downloading and copy subtitles. Please wait.'), forced=True) + self.localize('Downloading and copy subtitles. Please wait.')) for ind, title in subs: self.torrent.continueSession(ind) while iterator < 100: @@ -457,7 +461,7 @@ class TorrentPlayer(xbmc.Player): if self.iterator == 100 and self.next_dl and not self.next_dling and isinstance(self.next_contentId, int) and self.next_contentId != False: showMessage(self.localize('Torrent Downloading'), - self.localize('Starting download next episode!'), forced=True) + self.localize('Starting download next episode!')) self.torrent.stopSession() # xbmc.sleep(1000) path = self.torrent.getFilePath(self.next_contentId) diff --git a/changelog.txt b/changelog.txt index 41488c5..162a519 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,10 @@ English changelog at http://bit.ly/1MfSVUP +[B]Version 2.6.0[/B] +[+] Окно Поиска: Полноценный релиз +[+] Настройки: Добавлена возможность отключения уведомлений +[+] История Просмотров: При аварийном выходе данные остаются + [B]Version 2.5.6[/B] [+] Списки Медиа: Добавлен RuTorOrg diff --git a/functions.py b/functions.py index c72e562..9941335 100644 --- a/functions.py +++ b/functions.py @@ -93,10 +93,10 @@ def clearStorage(userStorageDirectory, force = False): if saved_bool: shutil.move(saved_temp, saved) - showMessage(Localization.localize('Storage'), Localization.localize('Storage has been cleared'), forced=True) + showMessage(Localization.localize('Storage'), Localization.localize('Storage has been cleared')) else: - showMessage(Localization.localize('Storage'), Localization.localize('Does not exists'), forced=True) + showMessage(Localization.localize('Storage'), Localization.localize('Does not exists')) log('[clearStorage]: fail storage '+userStorageDirectory + os.sep) try: @@ -152,8 +152,9 @@ def debug(msg, forced=False): def showMessage(heading, message, times=10000, forced=False): - xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s, "%s")' % ( - heading.replace('"', "'"), message.replace('"', "'"), times, icon)) + if forced or not getSettingAsBool('disable_notifications'): + xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s, "%s")' % ( + heading.replace('"', "'"), message.replace('"', "'"), times, icon)) debug(str((heading.replace('"', "'"), message.replace('"', "'"), times, icon))) @@ -1362,6 +1363,7 @@ def get_contentList(url): import Downloader url = urllib.unquote_plus(url) + log('0' + __settings__.getSetting("lastTorrent")) __settings__.setSetting("lastTorrentUrl", url) classMatch = re.search('(\w+)::(.+)', url) @@ -1372,7 +1374,9 @@ def get_contentList(url): torrent = Downloader.Torrent(userStorageDirectory, url, torrentFilesDirectory=torrentFilesDirectory) + log('1'+__settings__.getSetting("lastTorrent")) __settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) + log('2'+__settings__.getSetting("lastTorrent")) append_filesize = __settings__.getSetting("append_filesize") == 'true' diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 895544e..cac403a 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -85,6 +85,7 @@ Enabled, optional Disabled Search Window Transparent Background + Disable Notifications Save path Call dialog Default diff --git a/resources/language/Russian/strings.xml b/resources/language/Russian/strings.xml index 168a464..0d0603d 100644 --- a/resources/language/Russian/strings.xml +++ b/resources/language/Russian/strings.xml @@ -79,6 +79,13 @@ Дополнительные Торрент-клиент Hentai (тонкая настр.) + Режим работы Окна Поиска + Включен, убрать старый вид + Включен, заменить старый вид + Включен, как опция + Отключен + Прозрачность Окна Поиска + Отключить Уведомления Директория для сохранения файлов Вызывать диалог Задать по умолчанию diff --git a/resources/settings.xml b/resources/settings.xml index fa7d48b..b435dd3 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -73,6 +73,7 @@ + diff --git a/searchwindow.py b/searchwindow.py index 59505aa..f6b5529 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -240,8 +240,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): navi = read.read() read.close() - debug('navi_load navi: '+str(navi)) - log('navi_load navi: ' + str(navi['route'])) + try: + debug('navi_load navi: '+str(navi)) + log('navi_load navi: ' + str(navi['route'])) + except: + log('navi_load load error') if navi and len(navi) > 0: self.navi = json.loads(navi) @@ -335,7 +338,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if query: self.input_search.setText(query) else: - query = self.input_search.getText() + if self.input_search.getText() not in ['', None]: + query = self.input_search.getText() + elif self.navi['last_query'] not in ['', None]: + query = self.navi['last_query'] + self.input_search.setText(self.navi['last_query']) log('Search query: ' + str(query)) @@ -814,7 +821,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): contentListNew = sorted(contentListNew, key=lambda x: x[0], reverse=False) for title, identifier, filesize in contentListNew: - params = {'mode': 'torrent_play', 'url': identifier, 'url2': ids_video.rstrip(','), 'filename': link} + params = {'mode': 'torrent_play', 'fileIndex': identifier, 'url2': ids_video.rstrip(','), 'url': link} self.drawItem(title, params) self.navi_save('open_torrent') @@ -865,7 +872,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): return label_list def context(self): - if self.getFocus() == self.listing: + try: + focused_control = self.getFocus() + except: + focused_control = None + if focused_control == self.listing: item = self.listing.getSelectedItem() params = json.loads(item.getfilename()) mode = params.get('mode') @@ -879,6 +890,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if ret > -1 and ret < len(label_list): getattr(self, "right_press" + str(ret + 1))() + elif focused_control == self.input_search: + self.input_search.setText('') def right_menu(self, mode='place'): if not mode == 'place': @@ -1028,7 +1041,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.navi_back() elif mode == 'torrent_play': if index == 1: - url = self.form_link('playTorrent', params) + url = self.form_link('playSTRM', params) xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) __settings__.setSetting('loadsw_onstop', 'true') self.close() @@ -1125,7 +1138,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): link_url = '' for key in link.keys(): if link.get(key) and key != 'mode': - link_url = '%s&%s=%s' % (link_url, key, urllib.quote_plus(link.get(key))) + link_url = '%s&%s=%s' % (link_url, key, urllib.quote_plus(ensure_str(link.get(key)))) url = '%s?action=%s' % ('plugin://plugin.video.torrenter/', action) + link_url else: url = '%s?action=%s&url=%s' % ('plugin://plugin.video.torrenter/', action, urllib.quote_plus(link)) From 0f61ad977e7adca853f0f3dc4ca13c922a7b9088 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sat, 7 Jan 2017 15:52:57 +0300 Subject: [PATCH 086/126] fixes --- Core.py | 5 +++-- Localization.py | 1 + addon.xml | 2 +- functions.py | 17 ++++++++++++++--- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Core.py b/Core.py index ff8189d..231c59a 100644 --- a/Core.py +++ b/Core.py @@ -55,6 +55,9 @@ class Core: if self.__settings__.getSetting('plugin_name') != self.__plugin__: #Every update run first_run_260() + if self.version_check(): + estuary() + self.__settings__.setSetting('first_run_260', 'True') self.__settings__.setSetting('plugin_name', self.__plugin__) #check_network_advancedsettings() @@ -317,7 +320,6 @@ class Core: params = {'mode': 'watched'} searchwindow.main(params) - def swsearch(self, params={}): if len(Searchers().get_active())<1: noActiveSerachers() @@ -330,7 +332,6 @@ class Core: import searchwindow searchwindow.main(params) - def DownloadStatus(self, params={}): db = DownloadDB() get = params.get diff --git a/Localization.py b/Localization.py index fb92526..e535ff5 100644 --- a/Localization.py +++ b/Localization.py @@ -809,6 +809,7 @@ def localize(text): 'Play (from start)':'Lejátszás (az elejétől)', }, 'ru': { + 'Torrenter has a better view style for Kodi 17 default skin.':'У Torrenter есть оптимизированный вид под новый скин Kodi 17.', 'is recommended for Kodi 17 users and now out of beta.': 'рекомендовано пользователям Kodi 17 и вышло из беты.', 'You can disable it usage in Settings.':'Его можно отключить в настройках плагина.', 'Move Up': 'Вверх', diff --git a/addon.xml b/addon.xml index 657ce7b..1c42334 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/functions.py b/functions.py index 9941335..88669f9 100644 --- a/functions.py +++ b/functions.py @@ -1363,7 +1363,7 @@ def get_contentList(url): import Downloader url = urllib.unquote_plus(url) - log('0' + __settings__.getSetting("lastTorrent")) + debug('0' + __settings__.getSetting("lastTorrent")) __settings__.setSetting("lastTorrentUrl", url) classMatch = re.search('(\w+)::(.+)', url) @@ -1374,9 +1374,9 @@ def get_contentList(url): torrent = Downloader.Torrent(userStorageDirectory, url, torrentFilesDirectory=torrentFilesDirectory) - log('1'+__settings__.getSetting("lastTorrent")) + debug('1'+__settings__.getSetting("lastTorrent")) __settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) - log('2'+__settings__.getSetting("lastTorrent")) + debug('2'+__settings__.getSetting("lastTorrent")) append_filesize = __settings__.getSetting("append_filesize") == 'true' @@ -1886,6 +1886,17 @@ def first_run_260(): searchwindow.main() +def estuary(): + if __settings__.getSetting('skin_optimization') not in ['7', '0'] and \ + __settings__.getSetting('ask17_skin_optimization') != 'true': + + yes = xbmcgui.Dialog().yesno('< %s >' % (Localization.localize('Torrenter Update ') + '2.6.0'), + Localization.localize('Torrenter has a better view style for Kodi 17 default skin.'), + Localization.localize('Would you like to try it?'), ) + if yes: + __settings__.setSetting('skin_optimization', '7') + __settings__.setSetting('ask17_skin_optimization', 'true') + def seeking_warning(seek): if __settings__.getSetting('torrent_player')!='1': seek_point = '%02d:%02d:%02d' % ((seek / (60*60)), (seek / 60) % 60, seek % 60) From 76702025eff5f8b1061080a660d5ac6eec34293e Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sat, 7 Jan 2017 23:38:02 +0300 Subject: [PATCH 087/126] focus fix --- Core.py | 2 +- functions.py | 4 ++-- searchwindow.py | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Core.py b/Core.py index 231c59a..ec2a295 100644 --- a/Core.py +++ b/Core.py @@ -1475,7 +1475,7 @@ class Core: def playTorrent(self, params={}): if params.get('filename'): - torrentUrl = params.get('filename') + torrentUrl = unquote(params.get('filename')) else: torrentUrl = self.__settings__.getSetting("lastTorrent") #xbmc.executebuiltin('Action(Stop)') diff --git a/functions.py b/functions.py index 88669f9..a0833ed 100644 --- a/functions.py +++ b/functions.py @@ -1888,14 +1888,14 @@ def first_run_260(): def estuary(): if __settings__.getSetting('skin_optimization') not in ['7', '0'] and \ - __settings__.getSetting('ask17_skin_optimization') != 'true': + __settings__.getSetting('ask17_skin_optimization') != 'True': yes = xbmcgui.Dialog().yesno('< %s >' % (Localization.localize('Torrenter Update ') + '2.6.0'), Localization.localize('Torrenter has a better view style for Kodi 17 default skin.'), Localization.localize('Would you like to try it?'), ) if yes: __settings__.setSetting('skin_optimization', '7') - __settings__.setSetting('ask17_skin_optimization', 'true') + __settings__.setSetting('ask_skin_optimization', 'True') def seeking_warning(seek): if __settings__.getSetting('torrent_player')!='1': diff --git a/searchwindow.py b/searchwindow.py index f6b5529..6103b5c 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -64,6 +64,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.setGeometry(1280, 720, 9, 16) self.set_navi() self.set_controls() + self.set_focus() self.connect_controls() if params and params.get('mode'): if params.get('mode') == 'load': @@ -253,7 +254,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def navi_save(self, mode = None): debug('navi_save init') - if mode: self.set_focus(mode) + self.set_focus(mode) navi = json.dumps(self.navi) @@ -317,7 +318,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.right_menu(mode if not right_menu else right_menu) self.listing.reset() - def set_focus(self, mode): + def set_focus(self, mode = None): if not self.listing.size(): if mode and hasattr(self, "button_" + mode): self.setFocus(getattr(self, "button_" + mode)) From 97470089b931d24906a6ab09609d155c7fbb698e Mon Sep 17 00:00:00 2001 From: Kingul Date: Sun, 8 Jan 2017 11:34:26 +0200 Subject: [PATCH 088/126] fix searchwindow first time use --- searchwindow.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/searchwindow.py b/searchwindow.py index 6103b5c..266fbd5 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -237,6 +237,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if not xbmcvfs.exists(__tmppath__): xbmcvfs.mkdirs(__tmppath__) navi_file = os.path.join(__tmppath__, 'navi.txt') + if not xbmcvfs.exists(navi_file): + nav_content = '{"last_link": null, "last_query": null, "filesList": [], "last_addtime": null, "last_top_button": 5, "route": [{"params": {}, "last_listing_item": 0, "mode": "close"}, {"last_listing_item": 0, "params": {}, "mode": "history"}], "contentList": [], "last_right_button": 1, "searchersList": []}' + with open(xbmc.translatePath(navi_file), 'wb') as f: f.write(nav_content) read = xbmcvfs.File(navi_file, 'r') navi = read.read() read.close() From 3eb68a166a81f1b7d8647898cf2088b5e38e6e5d Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sun, 8 Jan 2017 22:07:06 +0300 Subject: [PATCH 089/126] fixes --- Core.py | 18 ++++++++++++------ functions.py | 5 +++-- searchwindow.py | 15 +++++++++++---- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/Core.py b/Core.py index ec2a295..86e517f 100644 --- a/Core.py +++ b/Core.py @@ -1554,10 +1554,13 @@ class Core: searcher = classMatch.group(1) url = Searchers().downloadWithSearcher(classMatch.group(2), searcher) torrent = Downloader.Torrent(self.userStorageDirectory, torrentFilesDirectory=self.torrentFilesDirectory) - self.__settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) - if fileIndex==None: fileIndex = chooseFile(torrent.getContentList()) + filename = torrent.saveTorrent(url) + self.__settings__.setSetting("lastTorrent", filename) + if fileIndex == None: fileIndex = chooseFile(torrent.getContentList()) if fileIndex: - xbmc.executebuiltin('xbmc.RunPlugin("plugin://plugin.video.torrenter/?action=playTorrent&url='+fileIndex+'")') + params = {'url': fileIndex, 'filename': filename} + self.playTorrent(params) + #xbmc.executebuiltin('xbmc.RunPlugin("plugin://plugin.video.torrenter/?action=playTorrent&url=%s' % (fileIndex)) def openTorrent(self, params={}): get = params.get @@ -1576,7 +1579,8 @@ class Core: torrent = Downloader.Torrent(self.userStorageDirectory, torrentFilesDirectory=self.torrentFilesDirectory) if not torrent: torrent = Downloader.Torrent(self.userStorageDirectory, torrentFilesDirectory=self.torrentFilesDirectory) - self.__settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) + filename = torrent.saveTorrent(url) + self.__settings__.setSetting("lastTorrent", filename) append_filesize = self.__settings__.getSetting("append_filesize") == 'true' hasSize = False @@ -1612,9 +1616,11 @@ class Core: 'XBMC.RunPlugin(%s)' % ('%s?action=%s&ind=%s') % ( sys.argv[0], 'downloadLibtorrent', str(identifier))), ] - link = {'url': identifier, 'thumbnail': thumbnail, 'save_folder':save_folder, 'filename':url} + link = {'url': identifier, 'thumbnail': thumbnail, 'save_folder':save_folder, + 'filename':ensure_str(filename)} self.drawItem(title, 'playTorrent', link, image=thumbnail, isFolder=False, - action2=ids_video.rstrip(','), contextMenu=contextMenu, replaceMenu=False, fileSize=filesize) + action2=ids_video.rstrip(','), contextMenu=contextMenu, + replaceMenu=False, fileSize=filesize) view_style('openTorrent') p_handle = int(sys.argv[1]) try: diff --git a/functions.py b/functions.py index a0833ed..a565b02 100644 --- a/functions.py +++ b/functions.py @@ -1375,7 +1375,8 @@ def get_contentList(url): torrent = Downloader.Torrent(userStorageDirectory, url, torrentFilesDirectory=torrentFilesDirectory) debug('1'+__settings__.getSetting("lastTorrent")) - __settings__.setSetting("lastTorrent", torrent.saveTorrent(url)) + filename = torrent.saveTorrent(url) + __settings__.setSetting("lastTorrent", filename) debug('2'+__settings__.getSetting("lastTorrent")) append_filesize = __settings__.getSetting("append_filesize") == 'true' @@ -1393,7 +1394,7 @@ def get_contentList(url): debug('get_contentList contentList: ' + str(contentList)) - return contentList + return contentList, filename def join_list(l, char=', ', replace=''): string='' diff --git a/searchwindow.py b/searchwindow.py index 266fbd5..3e9916a 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -96,6 +96,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): 'last_addtime': None, 'last_query': None, 'last_link': None, + 'last_filename': None, 'route': [{'mode': 'close', 'params': {}, 'last_listing_item': 0}] } @@ -238,8 +239,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): xbmcvfs.mkdirs(__tmppath__) navi_file = os.path.join(__tmppath__, 'navi.txt') if not xbmcvfs.exists(navi_file): - nav_content = '{"last_link": null, "last_query": null, "filesList": [], "last_addtime": null, "last_top_button": 5, "route": [{"params": {}, "last_listing_item": 0, "mode": "close"}, {"last_listing_item": 0, "params": {}, "mode": "history"}], "contentList": [], "last_right_button": 1, "searchersList": []}' - with open(xbmc.translatePath(navi_file), 'wb') as f: f.write(nav_content) + self.set_navi() + with open(xbmc.translatePath(navi_file), 'wb') as f: f.write(str(self.navi)) read = xbmcvfs.File(navi_file, 'r') navi = read.read() read.close() @@ -804,8 +805,11 @@ class SearchWindow(pyxbmct.AddonDialogWindow): # cache if link != self.navi['last_link']: - self.navi['contentList'] = get_contentList(link) + self.navi['contentList'], filename = get_contentList(link) + else: + filename = self.navi['last_filename'] self.navi['last_link'] = link + self.navi['last_filename'] = filename dirList, contentListNew = cutFolder(self.navi['contentList'], tdir) @@ -825,7 +829,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): contentListNew = sorted(contentListNew, key=lambda x: x[0], reverse=False) for title, identifier, filesize in contentListNew: - params = {'mode': 'torrent_play', 'fileIndex': identifier, 'url2': ids_video.rstrip(','), 'url': link} + params = {'mode': 'torrent_play', 'fileIndex': identifier, 'url2': ids_video.rstrip(','), 'url': link, + 'filename': filename} self.drawItem(title, params) self.navi_save('open_torrent') @@ -1045,6 +1050,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.navi_back() elif mode == 'torrent_play': if index == 1: + if filename and xbmcvfs.exists(filename): + params['url'] = ensure_str(filename) url = self.form_link('playSTRM', params) xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) __settings__.setSetting('loadsw_onstop', 'true') From b925285c42c44d4cae128fb2e36ba128a040031d Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Mon, 9 Jan 2017 19:53:06 +0300 Subject: [PATCH 090/126] fixes --- searchwindow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/searchwindow.py b/searchwindow.py index 3e9916a..ef466c5 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -240,7 +240,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): navi_file = os.path.join(__tmppath__, 'navi.txt') if not xbmcvfs.exists(navi_file): self.set_navi() - with open(xbmc.translatePath(navi_file), 'wb') as f: f.write(str(self.navi)) + with open(xbmc.translatePath(navi_file), 'w') as f: f.write(json.dumps(self.navi)) read = xbmcvfs.File(navi_file, 'r') navi = read.read() read.close() From 7c27a5d311a84c76db43f16e8e0b80a0b96c993c Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Mon, 9 Jan 2017 19:54:58 +0300 Subject: [PATCH 091/126] fixes --- searchwindow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/searchwindow.py b/searchwindow.py index ef466c5..762d74b 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -829,7 +829,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): contentListNew = sorted(contentListNew, key=lambda x: x[0], reverse=False) for title, identifier, filesize in contentListNew: - params = {'mode': 'torrent_play', 'fileIndex': identifier, 'url2': ids_video.rstrip(','), 'url': link, + params = {'mode': 'torrent_play', 'index': identifier, 'url2': ids_video.rstrip(','), 'url': link, 'filename': filename} self.drawItem(title, params) From 9193b1463893f4a2ec7a3aae28fb7d3a7eef93ae Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Mon, 9 Jan 2017 19:56:18 +0300 Subject: [PATCH 092/126] fixes --- Core.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Core.py b/Core.py index 86e517f..e7e28fe 100644 --- a/Core.py +++ b/Core.py @@ -1546,6 +1546,7 @@ class Core: get = params.get xbmc.executebuiltin('xbmc.Playlist.Clear') url = unquote(get("url"), None) + url2 = unquote(get("url2"), None) fileIndex = unquote(get("index"), None) if url: self.__settings__.setSetting("lastTorrentUrl", url) @@ -1559,6 +1560,7 @@ class Core: if fileIndex == None: fileIndex = chooseFile(torrent.getContentList()) if fileIndex: params = {'url': fileIndex, 'filename': filename} + if url2: params['url2'] = url2 self.playTorrent(params) #xbmc.executebuiltin('xbmc.RunPlugin("plugin://plugin.video.torrenter/?action=playTorrent&url=%s' % (fileIndex)) From ed06cf611e229d53e13074814882a69eacebd93c Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Mon, 9 Jan 2017 22:44:05 +0300 Subject: [PATCH 093/126] external for myshows --- searchwindow.py | 87 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 2 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index 762d74b..c9e7207 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -71,6 +71,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.navi_load() elif params.get('mode') == 'search': self.search(params) + elif params.get('mode') == 'externalsearch': + self.externalsearch(params) elif params.get('mode') == 'history': self.history() elif params.get('mode') == 'downloadstatus': @@ -373,6 +375,75 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.drawItem(title, {'mode': 'search_item', 'filename': link}, image) self.setFocus(self.listing) + def externalsearch(self, params={}): + log('search init params: ' + str(params)) + + if hasattr(self, 'params'): + params = self.params + + self.params = params + get = params.get + query = unquote(get('query'),'') + external = unquote(params.get("external"), 'torrenterall') + back_url = unquote(get("back_url"),'') + self.return_name = unquote(get("return_name"),'') + sdata = unquote(get("sdata"),'{}') + + self.reconnect(self.button_search, self.externalsearch) + self.navi_route('externalsearch', params) + + try: + sdata = json.loads(sdata) + except: + sdata = json.loads(urllib.unquote_plus(sdata)) + + + if self.input_search.getText() not in ['', None]: + query = self.input_search.getText() + else: + self.input_search.setText(query) + + #contextMenu = [ + # (self.localize('Add to %s') % return_name, + # 'XBMC.RunPlugin(%s)' % (back_url + '&stringdata=' + urllib.quote_plus( + # json.dumps(sdata)))), + + + # url = 'plugin://plugin.video.torrenter/?action=searchWindow&mode=externalsearch&query=%s' \ + # '&sdata=%s&external=%s&back_url=%s&return_name=%s' % \ + # (urllib.quote_plus(query), urllib.quote_plus(json.dumps(sdata)), + # self.externals[self.stype], urllib.quote_plus(back_self.url), + # urllib.quote_plus(return_name)) + + log('Search query: ' + str(query)) + + searchersList = [] + + if not external or external == 'torrenterall': + searchersList = get_searchersList() + elif external == 'torrenterone': + slist = Searchers().list().keys() + ret = xbmcgui.Dialog().select(self.localize('Choose searcher')+':', slist) + if ret > -1 and ret < len(slist): + external = slist[ret] + searchersList.append(external) + else: + searchersList.append(external) + + if len(query) > 0: + self.navi['filesList'] = get_filesList(query, searchersList) + else: + self.navi['filesList'] = [] + + if self.navi['filesList']: + for (order, seeds, leechers, size, title, link, image) in self.navi['filesList']: + title = titleMake(seeds, leechers, size, title) + sdata['filename'] = link + stringdata = json.dumps(sdata) + self.drawItem(title, {'mode': 'externalsearch_item', 'filename': link, + 'stringdata': stringdata, 'back_url': back_url}, image) + self.setFocus(self.listing) + def history(self, params = {}): self.navi_route('history', params) @@ -844,6 +915,12 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.localize('Download via T-client'), self.localize('Download via Libtorrent'), self.localize('Info'),] + if mode in ['externalsearch', 'externalsearch_item']: + label_list = [self.localize('Add to %s') % self.return_name, + self.localize('Open'), + self.localize('Download via T-client'), + self.localize('Download via Libtorrent'), + self.localize('Info'),] elif mode in ['torrent_subfolder', 'file_browser', 'subfolder']: label_list = [self.localize('Open'),] elif mode in ['torrent_moveup', 'browser_moveup']: @@ -1026,8 +1103,14 @@ class SearchWindow(pyxbmct.AddonDialogWindow): tdir = params.get('tdir') action = None - if mode in ['search_item', 'torrent_subfolder']: - if index == 1: + if mode in ['search_item', 'torrent_subfolder', 'externalsearch', 'externalsearch_item']: + if mode in ['externalsearch', 'externalsearch_item']: + index = index - 1 + + if index == 0: + url = params.get('back_url') + '&stringdata=' + urllib.quote_plus(params.get('stringdata')) + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) + elif index == 1: params = {'link': filename, 'tdir': tdir} self.open_torrent(params) elif index == 2: From 01f94d009d747289b0bd8442ecaac19340df899f Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Tue, 10 Jan 2017 20:26:45 +0300 Subject: [PATCH 094/126] cleaning --- Anteoloader.py | 24 +----------------------- addon.xml | 2 +- changelog.txt | 3 +++ functions.py | 5 ++++- 4 files changed, 9 insertions(+), 25 deletions(-) diff --git a/Anteoloader.py b/Anteoloader.py index d4ae9f6..8673171 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -350,16 +350,6 @@ class AnteoPlayer(xbmc.Player): self.torrentUrl = self.torrentUrl def setup_engine(self): - #uri=None, binaries_path=None, platform=None, download_path=".", - #bind_host='127.0.0.1', bind_port=5001, connections_limit=None, download_kbps=None, upload_kbps=None, - #enable_dht=True, enable_lsd=True, enable_natpmp=True, enable_upnp=True, enable_scrape=False, - #log_stats=False, encryption=Encryption.ENABLED, keep_complete=False, keep_incomplete=False, - #keep_files=False, log_files_progress=False, log_overall_progress=False, log_pieces_progress=False, - #listen_port=6881, use_random_port=False, max_idle_timeout=None, no_sparse=False, resume_file=None, - #user_agent=None, startup_timeout=5, state_file=None, enable_utp=True, enable_tcp=True, - #debug_alerts=False, logger=None, torrent_connect_boost=50, connection_speed=50, - #peer_connect_timeout=15, request_timeout=20, min_reconnect_time=60, max_failcount=3, - #dht_routers=None, trackers=None) encryption = Encryption.ENABLED if self.__settings__.getSetting('encryption') == 'true' else Encryption.DISABLED upload_limit = int(self.__settings__.getSetting("upload_limit"))*1024/8 if self.__settings__.getSetting( @@ -400,16 +390,10 @@ class AnteoPlayer(xbmc.Player): keep_files=keep_files, user_agent=user_agent, resume_file=resume_file, enable_dht=enable_dht) def buffer(self): - #self.pre_buffer_bytes = 30*1024*1024 #30 MB ready = False progressBar = xbmcgui.DialogProgress() progressBar.create('[%sPlayer v%s] ' % (author, __version__) + self.localize('Please Wait'), self.localize('Seeds searching.')) - #if self.subs_dl: - # subs = self.torrent.getSubsIds(os.path.basename(self.torrent.getFilePath(self.contentId))) - # if len(subs) > 0: - # for ind, title in subs: - # self.torrent.continueSession(ind) while not xbmc.abortRequested and not ready: xbmc.sleep(500) @@ -569,10 +553,10 @@ class AnteoPlayer(xbmc.Player): status = self.engine.status() file_status = self.engine.file_status(self.contentId) self.watchedTime = xbmc.Player().getTime() - self.totalTime = xbmc.Player().getTotalTime() if self.iterator == 100 and debug_counter < 100: debug_counter += 1 else: + self.totalTime = xbmc.Player().getTotalTime() self.print_debug(status) debug_counter=0 @@ -586,12 +570,6 @@ class AnteoPlayer(xbmc.Player): log('[loop]: xbmc.Player().pause()') xbmc.sleep(1000) - #if not self.seeding_run and self.iterator == 100 and self.seeding: - #self.seeding_run = True - #self.seed(self.contentId) - #self.seeding_status = True - # xbmc.sleep(7000) - def onPlayBackStarted(self): for f in self.on_playback_started: f() diff --git a/addon.xml b/addon.xml index 1c42334..18d7583 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + diff --git a/changelog.txt b/changelog.txt index 162a519..bb9ad07 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,8 @@ English changelog at http://bit.ly/1MfSVUP +[B]Version 2.6.1[/B] +[+] Окно Поиска: Использование окна в сторонних плагинах + [B]Version 2.6.0[/B] [+] Окно Поиска: Полноценный релиз [+] Настройки: Добавлена возможность отключения уведомлений diff --git a/functions.py b/functions.py index a565b02..4345f76 100644 --- a/functions.py +++ b/functions.py @@ -1072,7 +1072,10 @@ class WatchedHistoryDB: return x if x else None def add(self, filename, foldername = None, seek = 0, length = 1, ind = 0, size = 0): - watchedPercent = int((float(seek) / float(length)) * 100) + try: + watchedPercent = int((float(seek) / float(length)) * 100) + except: + watchedPercent = 0 max_history_add = int(__settings__.getSetting('max_history_add')) if self.history_bool and watchedPercent <= max_history_add: self._connect() From 73add38efc5babdadc6e6dc3a4da52892adfdbe6 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Tue, 10 Jan 2017 20:34:13 +0300 Subject: [PATCH 095/126] return to kostil --- Core.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/Core.py b/Core.py index e7e28fe..5a49c61 100644 --- a/Core.py +++ b/Core.py @@ -1547,7 +1547,7 @@ class Core: xbmc.executebuiltin('xbmc.Playlist.Clear') url = unquote(get("url"), None) url2 = unquote(get("url2"), None) - fileIndex = unquote(get("index"), None) + index = unquote(get("index"), None) if url: self.__settings__.setSetting("lastTorrentUrl", url) classMatch = re.search('(\w+)::(.+)', url) @@ -1557,12 +1557,18 @@ class Core: torrent = Downloader.Torrent(self.userStorageDirectory, torrentFilesDirectory=self.torrentFilesDirectory) filename = torrent.saveTorrent(url) self.__settings__.setSetting("lastTorrent", filename) - if fileIndex == None: fileIndex = chooseFile(torrent.getContentList()) - if fileIndex: - params = {'url': fileIndex, 'filename': filename} - if url2: params['url2'] = url2 - self.playTorrent(params) - #xbmc.executebuiltin('xbmc.RunPlugin("plugin://plugin.video.torrenter/?action=playTorrent&url=%s' % (fileIndex)) + if index == None: index = chooseFile(torrent.getContentList()) + if index: + #params = {'url': index, 'filename': filename} + #if url2: params['url2'] = url2 + #self.playTorrent(params) + + url = 'plugin://plugin.video.torrenter/?action=playTorrent' + url += '&url=%s' % (str(index)) + if url2: url += '&url2=%s' % (url2) + if filename: url += '&filename=%s' % (urllib.quote_plus(ensure_str(filename))) + + xbmc.executebuiltin('xbmc.RunPlugin("%s")' % (url)) def openTorrent(self, params={}): get = params.get From 57b16320823d1b3b34702d9c391ca31dfea9f38b Mon Sep 17 00:00:00 2001 From: Kingul Date: Thu, 12 Jan 2017 11:13:14 +0200 Subject: [PATCH 096/126] fix first time searchwindow user --- searchwindow.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/searchwindow.py b/searchwindow.py index c9e7207..a9a8c64 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -99,7 +99,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): 'last_query': None, 'last_link': None, 'last_filename': None, - 'route': [{'mode': 'close', 'params': {}, 'last_listing_item': 0}] + 'route': [{'mode': 'close', 'params': {}, 'last_listing_item': 0}, + {"last_listing_item": 0, "params": {}, "mode": "history"}] } def set_controls(self): From 5e5a45aa22dccf20f74dd0268d89b86cf887fc93 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Fri, 13 Jan 2017 19:38:22 +0300 Subject: [PATCH 097/126] fixes --- resources/skins/Default/720p/movieinfo.xml | 218 ------------------ resources/skins/Default/720p/reviews.xml | 127 ---------- .../Default/media/ConfluenceDialogBack.png | Bin 8551 -> 0 bytes .../ConfluenceDialogCloseButton-focus.png | Bin 5216 -> 0 bytes .../media/ConfluenceDialogCloseButton.png | Bin 4522 -> 0 bytes .../Default/media/Confluencedialogheader.png | Bin 4875 -> 0 bytes resources/skins/DialogReviews.py | 63 ----- resources/skins/DialogXml.py | 83 ------- resources/skins/__init__.py | 0 searchwindow.py | 3 +- 10 files changed, 2 insertions(+), 492 deletions(-) delete mode 100644 resources/skins/Default/720p/movieinfo.xml delete mode 100644 resources/skins/Default/720p/reviews.xml delete mode 100644 resources/skins/Default/media/ConfluenceDialogBack.png delete mode 100644 resources/skins/Default/media/ConfluenceDialogCloseButton-focus.png delete mode 100644 resources/skins/Default/media/ConfluenceDialogCloseButton.png delete mode 100644 resources/skins/Default/media/Confluencedialogheader.png delete mode 100644 resources/skins/DialogReviews.py delete mode 100644 resources/skins/DialogXml.py delete mode 100644 resources/skins/__init__.py diff --git a/resources/skins/Default/720p/movieinfo.xml b/resources/skins/Default/720p/movieinfo.xml deleted file mode 100644 index 27494b1..0000000 --- a/resources/skins/Default/720p/movieinfo.xml +++ /dev/null @@ -1,218 +0,0 @@ - - - 1 - 240 - 20 - - dialogeffect - - - WindowOpen - WindowClose - - background image - 0 - 0 - 800 - 680 - ConfluenceDialogBack.png - - - Dialog Header image - 40 - 16 - 720 - 40 - Confluencedialogheader.png - - - header label - 40 - 20 - 720 - 30 - font13_title - - center - center - selected - black - - - - Close Window button - 710 - 15 - 64 - 32 - - - - PreviousMenu - ConfluenceDialogCloseButton-focus.png - ConfluenceDialogCloseButton.png - 10 - 10 - 10 - 10 - system.getbool(input.enablemouse) - - - - 760 - 100 - 25 - 495 - ScrollBarV.png - ScrollBarV_bar.png - ScrollBarV_bar_focus.png - ScrollBarNib.png - ScrollBarNib.png - 30 - 131 - true - IntegerGreaterThan(Container(32).NumPages,1) - vertical - - - - Dialog Header image - 33 - 85 - 104 - 149 - - - - - rating - 34 - 240 - 102 - 20 - true - left - center - false - - false - font10 - white - black - false - - - - rating - 34 - 260 - 102 - 20 - true - left - center - false - - false - font10 - white - black - false - - - - kinopoisk - 34 - 292 - 102 - 38 - - - - - filepath - 180 - 70 - 550 - 60 - 470 - left - top - font18 - Нет описания - center - center - white - black - true - - - 615 - 50 - - - close - 350 - 0 - 320 - 40 - center - center - font12_title - - 33 - 60 - 30 - 30 - - - - play - 20 - -50 - 320 - 40 - center - center - font12_title - - 60 - 30 - 33 - 33 - - - - libtorrent - 350 - -50 - 320 - 40 - center - center - font12_title - - 131 - 60 - 22 - 22 - - - - tclient - 20 - 0 - 320 - 40 - center - center - font12_title - - 22 - 22 - 131 - 131 - - - - - diff --git a/resources/skins/Default/720p/reviews.xml b/resources/skins/Default/720p/reviews.xml deleted file mode 100644 index ccc51dc..0000000 --- a/resources/skins/Default/720p/reviews.xml +++ /dev/null @@ -1,127 +0,0 @@ - - - 1 - 240 - 20 - - dialogeffect - - - WindowOpen - WindowClose - - background image - 0 - 0 - 800 - 680 - DialogBack.png - - - Dialog Header image - 40 - 16 - 720 - 40 - dialogheader.png - - - header label - 40 - 20 - 720 - 30 - font13_title - - center - center - selected - black - - - - Close Window button - 710 - 15 - 64 - 32 - - - - PreviousMenu - DialogCloseButton-focus.png - DialogCloseButton.png - 10 - 10 - 10 - 10 - system.getbool(input.enablemouse) - - - - 760 - 100 - 25 - 495 - ScrollBarV.png - ScrollBarV_bar.png - ScrollBarV_bar_focus.png - ScrollBarNib.png - ScrollBarNib.png - 22 - 22 - true - IntegerGreaterThan(Container(32).NumPages,1) - vertical - - - - Dialog Header image - 33 - 85 - 104 - 149 - - - - - - filepath - 60 - 70 - 690 - 60 - 530 - left - top - font12 - Нет отзывов - center - center - white - black - true - - - 615 - 50 - - - close - 20 - 0 - 650 - 40 - center - center - font12_title - - 60 - 60 - 60 - 60 - - - - - - diff --git a/resources/skins/Default/media/ConfluenceDialogBack.png b/resources/skins/Default/media/ConfluenceDialogBack.png deleted file mode 100644 index 812801af5ce80311ee303165494fe1a1a2602abf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8551 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 diff --git a/resources/skins/Default/media/ConfluenceDialogCloseButton-focus.png b/resources/skins/Default/media/ConfluenceDialogCloseButton-focus.png deleted file mode 100644 index fdde65cdf987a59197b160ad14092b51da5fd4e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5216 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 IM6N<$f_r^~X8-^I diff --git a/resources/skins/Default/media/Confluencedialogheader.png b/resources/skins/Default/media/Confluencedialogheader.png deleted file mode 100644 index af7ba85beb3d021cc93127f2f5281bde2586aeb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4875 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 diff --git a/resources/skins/DialogReviews.py b/resources/skins/DialogReviews.py deleted file mode 100644 index 959f46d..0000000 --- a/resources/skins/DialogReviews.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- - -import re -import htmlentitydefs - -import xbmcgui - -pattern = re.compile("&(\w+?);") - -def html_entity_decode_char(m, defs=htmlentitydefs.entitydefs): - try: - return defs[m.group(1)] - except KeyError: - return m.group(0) - -def html_entity_decode(string): - return pattern.sub(html_entity_decode_char, string) - -KEY_BUTTON_BACK = 275 -KEY_KEYBOARD_ESC = 61467 -ACTION_PREVIOUS_MENU = 10 -ACTION_NAV_BACK = 92 -class DialogReviews(xbmcgui.WindowXMLDialog): - def onInit(self): - print "DialogReviews(): Window Initialized" - self.reviews_box = self.getControl(32) - self.reviews_box.setText(self.get_reviews()) - - self.setFocus(self.getControl(22)) - - def onAction(self, action): - buttonCode = action.getButtonCode() - if (action == ACTION_NAV_BACK or action == ACTION_PREVIOUS_MENU): - self.close() - if (buttonCode == KEY_BUTTON_BACK or buttonCode == KEY_KEYBOARD_ESC): - self.close() - - def onClick(self, controlID): - if (controlID == 2 or controlID == 22): - self.close() - - - def onFocus(self, controlID): - #print "onFocus(): control %i" % controlID - pass - - - def doModal(self, movieHtml): - self.movieHtml = movieHtml - xbmcgui.WindowXMLDialog.doModal(self) - - - def get_reviews(self): - reviews_texts = re.compile('

([^<]+)
',re.S).findall(self.movieHtml) - reviews_autors = re.compile('',re.S).findall(self.movieHtml) - reviews_dates = re.compile('
([^<]+)
',re.S).findall(self.movieHtml) - texts = '' - i = 0 - for text in reviews_texts: - texts = texts+"\n[B][COLOR purple]"+reviews_autors[i]+"[/COLOR][/B] [I]"+reviews_dates[i]+"[/I]\n" - texts = texts+html_entity_decode(text)+"\n" - i = i + 1 - return texts diff --git a/resources/skins/DialogXml.py b/resources/skins/DialogXml.py deleted file mode 100644 index ad29c21..0000000 --- a/resources/skins/DialogXml.py +++ /dev/null @@ -1,83 +0,0 @@ -# -*- coding: utf-8 -*- -import sys - -import xbmcgui -import Localization -import xbmc - -KEY_BUTTON_BACK = 275 -KEY_KEYBOARD_ESC = 61467 -ACTION_PREVIOUS_MENU = 10 -ACTION_NAV_BACK = 92 - - -class DialogXml(xbmcgui.WindowXMLDialog): - def onInit(self): - print "onInit(): Window Initialized" - localize = Localization.localize - color = '[COLOR %s]%s[/COLOR]' - self.movie_label = self.getControl(32) - self.movie_label.setText(self.movieInfo['desc']) - - if self.movieInfo.get('views'): - self.view_label = self.getControl(34) - self.view_label.setLabel(color % ('blue', localize('Views:')) + self.movieInfo['views']) - - self.view_label = self.getControl(35) - self.ratingcolor = 'green' - self.ratingint = int(self.movieInfo['rating']) - if (self.ratingint < 70): - self.ratingcolor = 'red' - self.view_label.setLabel( - color % ('blue', localize('Rating:')) + color % (self.ratingcolor, self.movieInfo['rating'])) - - self.movie_label = self.getControl(1) - self.movie_label.setLabel(self.movieInfo['title']) - - self.movie_label = self.getControl(32) - self.movie_label.setText(self.movieInfo['desc']) - - self.poster = self.getControl(31) - self.poster.setImage(self.movieInfo['poster']) - - self.poster = self.getControl(36) - self.poster.setImage(self.movieInfo['kinopoisk']) - self.getControl(22).setLabel(localize('Close')) - self.getControl(33).setLabel(localize('Download via T-client')) - self.getControl(30).setLabel(localize('Download via Libtorrent')) - self.getControl(131).setLabel(localize('Play')) - - self.setFocus(self.getControl(22)) - - def onAction(self, action): - buttonCode = action.getButtonCode() - if (action == ACTION_NAV_BACK or action == ACTION_PREVIOUS_MENU): - self.close() - if (buttonCode == KEY_BUTTON_BACK or buttonCode == KEY_KEYBOARD_ESC): - self.close() - - def onClick(self, controlID): - if (controlID == 2 or controlID == 22): - self.close() - if (controlID == 30): - self.RunPlugin('downloadLibtorrent') - if (controlID == 33): - self.RunPlugin('downloadFilesList') - if (controlID == 131): - self.RunPlugin('openTorrent&external=1') - - def RunPlugin(self, action): - if self.link: - exec_str = 'XBMC.RunPlugin(%s)' % \ - ('%s?action=%s&url=%s') % \ - (sys.argv[0], action, self.link) - xbmc.executebuiltin(exec_str) - - def onFocus(self, controlID): - # print "onFocus(): control %i" % controlID - pass - - def doModal(self, movieInfo, url): - self.movieInfo = movieInfo - self.link = url - xbmcgui.WindowXMLDialog.doModal(self) diff --git a/resources/skins/__init__.py b/resources/skins/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/searchwindow.py b/searchwindow.py index c9e7207..a9a8c64 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -99,7 +99,8 @@ class SearchWindow(pyxbmct.AddonDialogWindow): 'last_query': None, 'last_link': None, 'last_filename': None, - 'route': [{'mode': 'close', 'params': {}, 'last_listing_item': 0}] + 'route': [{'mode': 'close', 'params': {}, 'last_listing_item': 0}, + {"last_listing_item": 0, "params": {}, "mode": "history"}] } def set_controls(self): From 87fdda703d8b72d130fe0dbf3344fe748fb8adbd Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Fri, 13 Jan 2017 19:42:33 +0300 Subject: [PATCH 098/126] fixes --- searchwindow.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index a9a8c64..e3caecf 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -99,8 +99,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): 'last_query': None, 'last_link': None, 'last_filename': None, - 'route': [{'mode': 'close', 'params': {}, 'last_listing_item': 0}, - {"last_listing_item": 0, "params": {}, "mode": "history"}] + 'route': [{'mode': 'close', 'params': {}, 'last_listing_item': 0}] } def set_controls(self): @@ -243,6 +242,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): navi_file = os.path.join(__tmppath__, 'navi.txt') if not xbmcvfs.exists(navi_file): self.set_navi() + self.navi['route'].append({"last_listing_item": 0, "params": {}, "mode": "history"}) with open(xbmc.translatePath(navi_file), 'w') as f: f.write(json.dumps(self.navi)) read = xbmcvfs.File(navi_file, 'r') navi = read.read() From ff7ef919a4b952477b33960faaaecd995adc11d8 Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Fri, 13 Jan 2017 19:44:19 +0300 Subject: [PATCH 099/126] fixes --- searchwindow.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/searchwindow.py b/searchwindow.py index 6db9281..e3caecf 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -99,8 +99,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): 'last_query': None, 'last_link': None, 'last_filename': None, - 'route': [{'mode': 'close', 'params': {}, 'last_listing_item': 0}, - {"last_listing_item": 0, "params": {}, "mode": "history"}] + 'route': [{'mode': 'close', 'params': {}, 'last_listing_item': 0}] } def set_controls(self): From ad889038438238185c2a629fb9cf3282d87664af Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Sun, 15 Jan 2017 20:53:10 +0300 Subject: [PATCH 100/126] fix --- Core.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Core.py b/Core.py index 5a49c61..b46322a 100644 --- a/Core.py +++ b/Core.py @@ -1876,10 +1876,14 @@ class Core: f = open(url, 'rb') torrent = f.read() f.close() - from python_libtorrent import get_libtorrent - libtorrent = get_libtorrent() - info = libtorrent.torrent_info(libtorrent.bdecode(torrent)) - name = info.name() + try: + from python_libtorrent import get_libtorrent + libtorrent = get_libtorrent() + info = libtorrent.torrent_info(libtorrent.bdecode(torrent)) + name = info.name() + except: + log('get_libtorrent import error, name = None') + name = None success = Download().add(torrent, dirname) if success: showMessage(self.localize('Torrent-client Browser'), self.localize('Added!'), forced=True) From 076f439acbcde39d5b17d56a81311c8da7559a0d Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Tue, 17 Jan 2017 20:26:55 +0100 Subject: [PATCH 101/126] Update spanish.xml --- resources/language/spanish/spanish.xml | 167 +++++++++++++------------ 1 file changed, 90 insertions(+), 77 deletions(-) diff --git a/resources/language/spanish/spanish.xml b/resources/language/spanish/spanish.xml index 220f7db..1a1c461 100644 --- a/resources/language/spanish/spanish.xml +++ b/resources/language/spanish/spanish.xml @@ -1,97 +1,110 @@ - Lenguaje de Interface - Fijar Vista de Directorio - Desactivado - Directorio de Descarga (no FAT32) - Usar magnet-links - Mantener archivos descargados - Seguir compartiendo (seed) archivos descargados - Limite de velocidad de subida MBits/seg (0 - ilimitado) - Limite de velocidad de bajada MBits/seg (0 - ilimitado) - Usar solo libtorrent - Pre-descargar y reproducir próximo episodio - Descargar metadata para Listas de Contenido - Debug (Modo Desarrollador) - Confluence (por slng) - Transperency (por slng) - Confluence (por DiMartino) - Confluence (por RussakHH) - Activar historial de búsqueda + Idioma de la interfaz + Conservar estilo vista de directorios + No conservar + Directorio de descarga de archivos (no FAT32) + Utilizar enlaces magnet + Conserva de archivos descargados + Seguir compartiendo archivos descargados + Máx. vel. de subida en mbps (0 = ilimitada) + Máx. vel. de descarga en mbps (0 = ilimitada) + Utilizar solo libtorrent + Predescargar y reproducir episodio siguiente + Descargar metadatos de listas de contenido + Depuración (Modo desarrollador) + Confluence (de slng) + Transperency (de slng) + Confluence (de DiMartino) + Confluence (de RussakHH) + Habilitar historial de búsquedas python-libtorrent Ace Stream Reproductor P2P - Rest Settings in Programms - Cliente AceStream - Tiempo de Espera de búsqueda - Corto (10s) - Normal (20s) - Largo (30s) - Pre-descargar subtítulos para todos los directorios - Seguir compartiendo (seed) luego de la reproducción - Preguntar si cambiar almacenamiento antes de reproducir - Eliminar complementos rusos - Devolver complementos rusos - Acción al clickear torrent - Abrir Torrent + Restablecer ajustes en Add-ons de programas -- AceStream client + Duración de las búsquedas + Corta (10 s) + Normal (20 s) + Larga (30 s) + Descargar antes los subtítulos de todos los directorios + Seguir compartiendo después del visionado + Preguntar para cambiar de almacén antes de la reproducción + Borrar material en ruso + Restituir material en ruso + Efecto de clic sobre torrent + Abrir archivo torrent Abrir menú contextual - Descargar via cliente torrent - Descargar via python-libtorrent - Ordenar resultado de búsqueda por semillas - Frase opcional para búsqueda customizada - Encriptación - Número de hilo de búsqueda - Eliminar archivos - Guardar Archivos - Preguntar si guardar - Torrent2HTTP (libtorrent via http) - Auto-desbloquear proxy + Descargar vía cliente BitTorrent + Descargar vía python-libtorrent + Ordenar resultados por semillas + Frase para búsqueda personalizada + Cifrado + Número de hilos de búsqueda + Borrar archivos + Guardar archivos + Preguntar para guardar + Torrent2HTTP (libtorrent vía HTTP) + Desbloqueo automático de proxy Ninguno - Anti-zapret - Immunidad - Conexiones Máximas (0 - ilimitadas) - Usar puertos aleatorios + Anti-zapret (antirestricción) + Inmunidad + Núm. máx. de conexiones (0 = ilimitadas) + Utilizar puertos aleatorios Puerto para conexiones entrantes - Tamaño de pre-buffer anterior a la reproducción (MB) - Auto reproducir próximo episodio (o preguntar) + Tamaño de carga previa para empezar a reproducir (MB) + Autoreproducir episodio siguiente (o preguntar) Configuración de dispositivo - Promedio/Buena PC - Bajo el promedio PC/router - Tamaño de almacenamiento minimo para autolimpieza (GB) - Pausar video despues de iniciar - Ordenar resultados de búsqueda - by Semillas - no ordenar - por Nombre - Do not add to Watched History if played more (%) - Confluence (por safonov_ivan) - Aeon Nox (por joyrider) - pyrrent2http (python-libtorrent via http) - Añadir tamaño al nombre de archivo - Activar DHT + Promedio/Buen PC + Por debajo de la media, PC/router + Tamaño mínimo de almacenaje para autoborrado (GB) + Pausar vídeo tras el inicio + Ordenar resultados de la búsqueda + Por semillas + No ordenar + Por nombre + No añadir al historial de vistos si se reprodujo más de (%) + Confluence (de safonov_ivan) + Aeon Nox (de joyrider) + pyrrent2http (python-libtorrent vía HTTP) + Añadir tamaño al nombre del archivo + Activar protocolo DHT + Estuary (de DiMartino) + Presentación de la información + Al final + Al principio + En segunda línea + Arctic: Zephyr (de xbmc00) Interfaz Red P2P Avanzado - Cliente Torrent - Hentai (sintonia fina) - Ruta de Guardado - Diálogo de Llamado - Por Defecto + Cliente de BitTorrent + Hentai (reajustes) + Modo ventana de búsqueda + Habilitar ocultar estilo anterior + Habilitar reponer estilo anterior + Habilitar optativo + Deshabilitar + Fondo transparente de ventana de búsqueda + Desactivar notificaciones + Ruta para guardar + Preguntar + Por defecto Ruta - Crear subdirectorio para scraper + Crear subdirectorio para scrapper Host Puerto URL Usuario - Password - Cliente Torrent - URL (solamente, No SSL) - Reemplazo de Ruta (solo remoto) + Contraseña + Cliente de BitTorrent + URL (solo No SSL) + Sustitución de ruta (solo remoto) Cerrar - Abrir Configuración - Navegador de Cliente Torrent + Abrir ajustes + Navegador de cliente BitTorrent Instalar trackers - Configuración de trackers - Limpiar almacenamiento - Elegir buscador - No tienes buscador externo. Por favor instala uno. + Ajustes de trackers + Vaciar almacén + Seleccionar buscador + No hay buscador externo.Instale primero uno. From f499dd8502397476e83ed21922b657df4eb685ae Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Wed, 18 Jan 2017 15:59:45 +0300 Subject: [PATCH 102/126] external seek --- Anteoloader.py | 4 ++-- Core.py | 3 +++ Inposloader.py | 4 ++-- Player.py | 4 ++-- changelog.txt | 3 +++ functions.py | 28 ++++++++++++++++++++++++++-- 6 files changed, 38 insertions(+), 8 deletions(-) diff --git a/Anteoloader.py b/Anteoloader.py index 8673171..6b50e07 100644 --- a/Anteoloader.py +++ b/Anteoloader.py @@ -302,12 +302,12 @@ class AnteoPlayer(xbmc.Player): if self.buffer(): log('[AnteoPlayer]: ************************************* GOING LOOP') if self.setup_play(): - WatchedHistoryDB().add(self.basename, + WatchedHistoryDB().add(self.basename, self.torrentUrl, foldername(self.getContentList()[self.contentId]['title']), self.watchedTime, self.totalTime, self.contentId, self.fullSize) self.setup_subs() self.loop() - WatchedHistoryDB().add(self.basename, foldername(self.getContentList()[self.contentId]['title']), self.watchedTime, self.totalTime, self.contentId, self.fullSize) + WatchedHistoryDB().add(self.basename, self.torrentUrl, foldername(self.getContentList()[self.contentId]['title']), self.watchedTime, self.totalTime, self.contentId, self.fullSize) else: log('[AnteoPlayer]: ************************************* break') break diff --git a/Core.py b/Core.py index b46322a..ba8076c 100644 --- a/Core.py +++ b/Core.py @@ -1479,6 +1479,9 @@ class Core: else: torrentUrl = self.__settings__.getSetting("lastTorrent") #xbmc.executebuiltin('Action(Stop)') + if self.torrent_player != '1' and params.get('external') == '1' and not params.get('seek'): + params['seek'] = watched_seek(torrentUrl, params['url']) + self.userStorage(params) if self.torrent_player == '0': from Player import TorrentPlayer diff --git a/Inposloader.py b/Inposloader.py index b9c6128..89b86dd 100644 --- a/Inposloader.py +++ b/Inposloader.py @@ -273,12 +273,12 @@ class InposPlayer(xbmc.Player): while True: log('['+author+'Player]: ************************************* GOING LOOP') if self.setup_play(): - WatchedHistoryDB().add(self.basename, + WatchedHistoryDB().add(self.basename, self.torrentUrl, foldername(self.getContentList()[self.contentId]['title']), self.watchedTime, self.totalTime, self.contentId, self.fullSize) self.setup_subs() self.loop() - WatchedHistoryDB().add(self.basename, foldername(self.getContentList()[self.contentId]['title']), self.watchedTime, self.totalTime, self.contentId, self.fullSize) + WatchedHistoryDB().add(self.basename, self.torrentUrl, foldername(self.getContentList()[self.contentId]['title']), self.watchedTime, self.totalTime, self.contentId, self.fullSize) else: log('['+author+'Player]: ************************************* break') break diff --git a/Player.py b/Player.py index bf5c180..78909ba 100644 --- a/Player.py +++ b/Player.py @@ -166,12 +166,12 @@ class TorrentPlayer(xbmc.Player): debug('************************************* GOING LOOP') self.torrent.startSession() self.torrent.continueSession(self.contentId) - WatchedHistoryDB().add(self.basename, + WatchedHistoryDB().add(self.basename, self.torrentUrl, foldername(self.torrent.getContentList()[self.contentId]['title']), self.watchedTime, self.totalTime, self.contentId, self.fullSize / 1024 / 1024) self.loop() - WatchedHistoryDB().add(self.basename, foldername(self.torrent.getContentList()[self.contentId]['title']), self.watchedTime, self.totalTime, self.contentId, self.fullSize / 1024 / 1024) + WatchedHistoryDB().add(self.basename, self.torrentUrl, foldername(self.torrent.getContentList()[self.contentId]['title']), self.watchedTime, self.totalTime, self.contentId, self.fullSize / 1024 / 1024) else: break debug('************************************* GO NEXT?') diff --git a/changelog.txt b/changelog.txt index bb9ad07..777a953 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,8 @@ English changelog at http://bit.ly/1MfSVUP +[B]Version 2.6.2[/B] +[+] История Просмотров: Перемотка при внешнем вызове + [B]Version 2.6.1[/B] [+] Окно Поиска: Использование окна в сторонних плагинах diff --git a/functions.py b/functions.py index 4345f76..04d337e 100644 --- a/functions.py +++ b/functions.py @@ -1071,7 +1071,14 @@ class WatchedHistoryDB: self._close() return x if x else None - def add(self, filename, foldername = None, seek = 0, length = 1, ind = 0, size = 0): + def getbypathind(self, path, ind): + self._connect() + self.cur.execute('select seek from history where path="' + path + '" AND ind=' + ind) + x = self.cur.fetchone() + self._close() + return x if x else None + + def add(self, filename, path, foldername = None, seek = 0, length = 1, ind = 0, size = 0): try: watchedPercent = int((float(seek) / float(length)) * 100) except: @@ -1080,7 +1087,7 @@ class WatchedHistoryDB: if self.history_bool and watchedPercent <= max_history_add: self._connect() url = __settings__.getSetting("lastTorrentUrl") - path = __settings__.getSetting("lastTorrent") + #path = __settings__.getSetting("lastTorrent") if not foldername: foldername = '' self.cur.execute('delete from history where filename="' + decode(filename) + '"') @@ -2303,3 +2310,20 @@ def loadsw_onstop(): import searchwindow params = {'mode': 'load'} searchwindow.main(params) + +def watched_seek(filename, ind): + db = WatchedHistoryDB() + seek = db.getbypathind(filename, ind) + log('[watched_seek] seek - '+str(seek)) + if seek: + seek = seek[0] + seek = int(seek) if int(seek) > 3 * 60 else 0 + if seek > 0: + seek_text = '%02d:%02d:%02d' % ((seek / (60 * 60)), (seek / 60) % 60, seek % 60) + dialog_items = [Localization.localize('Play (from %s)') % seek_text, + Localization.localize('Play (from start)')] + ret = xbmcgui.Dialog().select(Localization.localize('Play (with seek)'), dialog_items) + if ret == 0: + return str(seek) + else: + return '0' \ No newline at end of file From 924dbafec17585cb1c4c7241f972cca4c565099a Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Wed, 18 Jan 2017 23:50:54 +0300 Subject: [PATCH 103/126] fix --- functions.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/functions.py b/functions.py index 04d337e..12990a9 100644 --- a/functions.py +++ b/functions.py @@ -2325,5 +2325,4 @@ def watched_seek(filename, ind): ret = xbmcgui.Dialog().select(Localization.localize('Play (with seek)'), dialog_items) if ret == 0: return str(seek) - else: - return '0' \ No newline at end of file + return '0' \ No newline at end of file From 9aed2a7738c98b9f581555ca4828a530d2788de2 Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Thu, 19 Jan 2017 18:00:49 +0100 Subject: [PATCH 104/126] Update addon.xml --- addon.xml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/addon.xml b/addon.xml index 18d7583..d134fdd 100644 --- a/addon.xml +++ b/addon.xml @@ -24,10 +24,14 @@ Так же плагин может добавлять, проигрывать и управлять скачками в торрент клиентах (uTorrent, Transmisson, Deluge и Vuse, qBittorrent) или средставми python-libtorrent. - GNU GPLv3 http://www.gnu.org/licenses/ - https://forums.tvaddons.ag/addon-releases/29224-torrenter-v2.html - http://xbmc.ru/forum/showthread.php?t=6837 - skype:kyonkodura - https://github.com/DiMartinoXBMC/plugin.video.torrenter + GNU GPLv3 http://www.gnu.org/licenses/ + Complemento con el que se pueden reproducir archivos de vídeo que se comparten en redes BitTorrent, sin necesidad de descargarlos completamente. + + Además, gestiona torrents y reproduce los archivos descargados con su propio cliente o con otros clientes externos (uTorrent, Transmisson, Vuse, Deluge, qBittorrent). + + https://forums.tvaddons.ag/addon-releases/29224-torrenter-v2.html + http://xbmc.ru/forum/showthread.php?t=6837 + skype:kyonkodura + https://github.com/DiMartinoXBMC/plugin.video.torrenter
From 387a2f91b4d9072413a199758063b98b74d413f4 Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Thu, 19 Jan 2017 18:33:55 +0100 Subject: [PATCH 105/126] Rename spanish.xml to strings.xml --- resources/language/spanish/{spanish.xml => strings.xml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename resources/language/spanish/{spanish.xml => strings.xml} (100%) diff --git a/resources/language/spanish/spanish.xml b/resources/language/spanish/strings.xml similarity index 100% rename from resources/language/spanish/spanish.xml rename to resources/language/spanish/strings.xml From 9c79ab955968aa7134037e1fb820cd18b9b5ef72 Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Sat, 21 Jan 2017 19:42:56 +0100 Subject: [PATCH 106/126] Update addon.xml --- addon.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addon.xml b/addon.xml index d134fdd..11b2db1 100644 --- a/addon.xml +++ b/addon.xml @@ -1,4 +1,4 @@ - + @@ -25,9 +25,9 @@ Так же плагин может добавлять, проигрывать и управлять скачками в торрент клиентах (uTorrent, Transmisson, Deluge и Vuse, qBittorrent) или средставми python-libtorrent. GNU GPLv3 http://www.gnu.org/licenses/ - Complemento con el que se pueden reproducir archivos de vídeo que se comparten en redes BitTorrent, sin necesidad de descargarlos completamente. + Complemento con el que podemos reproducir archivos de vídeo que se comparten en redes BitTorrent, sin necesidad de descargarlos previamente por completo. - Además, gestiona torrents y reproduce los archivos descargados con su propio cliente o con otros clientes externos (uTorrent, Transmisson, Vuse, Deluge, qBittorrent). + También nos permite gestionar torrents y elegir entre su propio cliente interno y otros externos (μTorrent, Transmission, Deluge, Vuze, qBittorrent), el cliente para las descargas. https://forums.tvaddons.ag/addon-releases/29224-torrenter-v2.html http://xbmc.ru/forum/showthread.php?t=6837 From ccf01896841d021fb15d2b60c95032fe4c7f70fd Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Sat, 21 Jan 2017 19:48:12 +0100 Subject: [PATCH 107/126] Update strings.xml --- resources/language/spanish/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/language/spanish/strings.xml b/resources/language/spanish/strings.xml index 1a1c461..0c3be51 100644 --- a/resources/language/spanish/strings.xml +++ b/resources/language/spanish/strings.xml @@ -5,7 +5,7 @@ No conservar Directorio de descarga de archivos (no FAT32) Utilizar enlaces magnet - Conserva de archivos descargados + Almacenaje de archivos descargados Seguir compartiendo archivos descargados Máx. vel. de subida en mbps (0 = ilimitada) Máx. vel. de descarga en mbps (0 = ilimitada) @@ -27,7 +27,7 @@ Normal (20 s) Larga (30 s) Descargar antes los subtítulos de todos los directorios - Seguir compartiendo después del visionado + Seguir compartiendo después de reproducir el vídeo Preguntar para cambiar de almacén antes de la reproducción Borrar material en ruso Restituir material en ruso @@ -62,14 +62,14 @@ Por semillas No ordenar Por nombre - No añadir al historial de vistos si se reprodujo más de (%) + No añadir a historial de vistos si no se reprodujo más de (%) Confluence (de safonov_ivan) Aeon Nox (de joyrider) pyrrent2http (python-libtorrent vía HTTP) Añadir tamaño al nombre del archivo Activar protocolo DHT Estuary (de DiMartino) - Presentación de la información + Modo presentación de datos Al final Al principio En segunda línea @@ -97,7 +97,7 @@ Usuario Contraseña Cliente de BitTorrent - URL (solo No SSL) + URL (no SSL) Sustitución de ruta (solo remoto) Cerrar Abrir ajustes @@ -106,5 +106,5 @@ Ajustes de trackers Vaciar almacén Seleccionar buscador - No hay buscador externo.Instale primero uno. + No hay buscador externo.Instale uno primero. From d607dbc999594ccbbe58a79687e7f3fdb34fe065 Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Sat, 21 Jan 2017 19:49:51 +0100 Subject: [PATCH 108/126] Update strings.xml --- resources/language/spanish/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/language/spanish/strings.xml b/resources/language/spanish/strings.xml index 0c3be51..4faabe0 100644 --- a/resources/language/spanish/strings.xml +++ b/resources/language/spanish/strings.xml @@ -106,5 +106,5 @@ Ajustes de trackers Vaciar almacén Seleccionar buscador - No hay buscador externo.Instale uno primero. + No hay buscador externo. Instale uno primero. From 71aea9b3180f68619f29160c50411f1c43b57368 Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Sat, 21 Jan 2017 20:11:29 +0100 Subject: [PATCH 109/126] Update addon.xml --- addon.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.xml b/addon.xml index 11b2db1..d137bfe 100644 --- a/addon.xml +++ b/addon.xml @@ -27,7 +27,7 @@ GNU GPLv3 http://www.gnu.org/licenses/ Complemento con el que podemos reproducir archivos de vídeo que se comparten en redes BitTorrent, sin necesidad de descargarlos previamente por completo. - También nos permite gestionar torrents y elegir entre su propio cliente interno y otros externos (μTorrent, Transmission, Deluge, Vuze, qBittorrent), el cliente para las descargas. + También nos permite gestionar torrents y elegir entre su propio cliente interno y otros clientes externos (μTorrent, Transmission, Deluge, Vuze, qBittorrent), el cliente BitTorrent con el que realizar las descargas. https://forums.tvaddons.ag/addon-releases/29224-torrenter-v2.html http://xbmc.ru/forum/showthread.php?t=6837 From 7fe72f1c60755d1bafc689c45de274168d9dc923 Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Sat, 21 Jan 2017 20:19:46 +0100 Subject: [PATCH 110/126] Update addon.xml --- addon.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.xml b/addon.xml index d137bfe..09c2978 100644 --- a/addon.xml +++ b/addon.xml @@ -27,7 +27,7 @@ GNU GPLv3 http://www.gnu.org/licenses/ Complemento con el que podemos reproducir archivos de vídeo que se comparten en redes BitTorrent, sin necesidad de descargarlos previamente por completo. - También nos permite gestionar torrents y elegir entre su propio cliente interno y otros clientes externos (μTorrent, Transmission, Deluge, Vuze, qBittorrent), el cliente BitTorrent con el que realizar las descargas. + También nos permite gestionar torrents y elegir entre su propio cliente interno y otros externos (μTorrent, Transmission, Deluge, Vuze, qBittorrent), el cliente BitTorrent con el que realizar las descargas. https://forums.tvaddons.ag/addon-releases/29224-torrenter-v2.html http://xbmc.ru/forum/showthread.php?t=6837 From 9aa8e25ecc5b38916eda175c3bde6adec836de90 Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Sat, 21 Jan 2017 20:23:19 +0100 Subject: [PATCH 111/126] Update strings.xml --- resources/language/spanish/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/language/spanish/strings.xml b/resources/language/spanish/strings.xml index 4faabe0..32fc6b7 100644 --- a/resources/language/spanish/strings.xml +++ b/resources/language/spanish/strings.xml @@ -51,7 +51,7 @@ Núm. máx. de conexiones (0 = ilimitadas) Utilizar puertos aleatorios Puerto para conexiones entrantes - Tamaño de carga previa para empezar a reproducir (MB) + Tamaño de precarga para empezar a reproducir (MB) Autoreproducir episodio siguiente (o preguntar) Configuración de dispositivo Promedio/Buen PC @@ -62,7 +62,7 @@ Por semillas No ordenar Por nombre - No añadir a historial de vistos si no se reprodujo más de (%) + No añadir a vistos si no se reprodujo más de (%) Confluence (de safonov_ivan) Aeon Nox (de joyrider) pyrrent2http (python-libtorrent vía HTTP) From 701797a3ff7b11dddbdafb57b487e2c3fc8073ab Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Sun, 22 Jan 2017 11:09:49 +0100 Subject: [PATCH 112/126] Update addon.xml --- addon.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addon.xml b/addon.xml index 09c2978..9f604cb 100644 --- a/addon.xml +++ b/addon.xml @@ -25,9 +25,9 @@ Так же плагин может добавлять, проигрывать и управлять скачками в торрент клиентах (uTorrent, Transmisson, Deluge и Vuse, qBittorrent) или средставми python-libtorrent. GNU GPLv3 http://www.gnu.org/licenses/ - Complemento con el que podemos reproducir archivos de vídeo que se comparten en redes BitTorrent, sin necesidad de descargarlos previamente por completo. + Complemento que nos permite reproducir archivos de vídeo que se comparten en redes BitTorrent, sin necesidad de descargarlos previamente por completo. - También nos permite gestionar torrents y elegir entre su propio cliente interno y otros externos (μTorrent, Transmission, Deluge, Vuze, qBittorrent), el cliente BitTorrent con el que realizar las descargas. + También gestiona torrents y nos deja elegir entre su propio cliente interno y otros externos (μTorrent, Transmission, Deluge, Vuze, qBittorrent), el cliente BitTorrent con el que realizar las descargas. https://forums.tvaddons.ag/addon-releases/29224-torrenter-v2.html http://xbmc.ru/forum/showthread.php?t=6837 From 43b951226d21a9fabfba63e1acc142a92d4b419d Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Sun, 22 Jan 2017 11:10:50 +0100 Subject: [PATCH 113/126] Update addon.xml --- addon.xml | 147 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 110 insertions(+), 37 deletions(-) diff --git a/addon.xml b/addon.xml index 9f604cb..be3cfaf 100644 --- a/addon.xml +++ b/addon.xml @@ -1,37 +1,110 @@ - - - - - - - - - - - - - - video - - - all - Plugin helps you to watch videos from p2p torrent-networks, without full predownload. - - It also can add, control torrents and play downloaded files with external torrent-client (uTorrent, Transmisson, Vuse, Deluge, qBittorrent) or python-libtorrent. - - GNU GPLv3 http://www.gnu.org/licenses/ - Плагин позволяет просматривать видео из пиринговых торрент-сетей, не дожидаясь полного скачивания. - - Так же плагин может добавлять, проигрывать и управлять скачками в торрент клиентах (uTorrent, Transmisson, Deluge и Vuse, qBittorrent) или средставми python-libtorrent. - - GNU GPLv3 http://www.gnu.org/licenses/ - Complemento que nos permite reproducir archivos de vídeo que se comparten en redes BitTorrent, sin necesidad de descargarlos previamente por completo. - - También gestiona torrents y nos deja elegir entre su propio cliente interno y otros externos (μTorrent, Transmission, Deluge, Vuze, qBittorrent), el cliente BitTorrent con el que realizar las descargas. - - https://forums.tvaddons.ag/addon-releases/29224-torrenter-v2.html - http://xbmc.ru/forum/showthread.php?t=6837 - skype:kyonkodura - https://github.com/DiMartinoXBMC/plugin.video.torrenter - - + + + Idioma de la interfaz + Fijar estilo visual + No fijar + Directorio de descarga de archivos (no FAT32) + Utilizar enlaces magnet + Almacenaje de archivos descargados + Seguir compartiendo archivos descargados + Máx. vel. de subida en mbps (0 = ilimitada) + Máx. vel. de descarga en mbps (0 = ilimitada) + Utilizar solo libtorrent + Predescargar y reproducir episodio siguiente + Descargar metadatos de listas de contenido + Depuración (Modo desarrollador) + Confluence (de slng) + Transperency (de slng) + Confluence (de DiMartino) + Confluence (de RussakHH) + Habilitar historial de búsquedas + python-libtorrent + Ace Stream + Reproductor P2P + Restablecer ajustes en Add-ons de programas -- AceStream client + Duración de las búsquedas + Corta (10 s) + Normal (20 s) + Larga (30 s) + Descargar antes los subtítulos de todos los directorios + Seguir compartiendo después de reproducir el vídeo + Preguntar para cambiar de almacén antes de la descarga + Borrar material en ruso + Restituir material en ruso + Efecto de clic sobre torrent + Abrir archivo torrent + Abrir menú contextual + Descargar vía cliente BitTorrent + Descargar vía python-libtorrent + Ordenar resultados por semillas + Frase para búsqueda personalizada + Cifrado + Número de hilos de búsqueda + Borrar archivos + Guardar archivos + Preguntar para guardar + Torrent2HTTP (libtorrent vía HTTP) + Desbloqueo automático de proxy + Ninguno + Anti-zapret (antirestricción) + Inmunidad + Núm. máx. de conexiones (0 = ilimitadas) + Utilizar puertos aleatorios + Puerto para conexiones entrantes + Tamaño de precarga para empezar a reproducir (MB) + No autoreproducir episodio siguiente (o preguntar) + Configuración de dispositivo + Promedio/Buen PC + Por debajo de la media, PC/router + Tamaño mínimo de almacenaje para autoborrado (GB) + Pausar vídeo tras el inicio + Ordenar resultados de la búsqueda + Por semillas + No ordenar + Por nombre + Añadir a historial de vistos después del (%) + Confluence (de safonov_ivan) + Aeon Nox (de joyrider) + pyrrent2http (python-libtorrent vía HTTP) + Añadir tamaño a nombre de archivo + Activar protocolo DHT + Estuary (de DiMartino) + Modo presentación de datos + Al final + Al principio + En segunda línea + Arctic: Zephyr (de xbmc00) + Interfaz + Red P2P + Avanzado + Cliente de BitTorrent + Hentai (reajustes) + Modo ventana de búsqueda + Habilitar ocultar estilo anterior + Habilitar reponer estilo anterior + Habilitar optativo + Deshabilitar + Fondo transparente de ventana de búsqueda + Desactivar notificaciones + Ruta para guardar + Preguntar + Por defecto + Ruta + Crear subdirectorio para scrapper + Host + Puerto + URL + Usuario + Contraseña + Cliente de BitTorrent + URL (no SSL) + Sustitución de ruta (solo remoto) + Cerrar + Abrir ajustes + Navegador de cliente BitTorrent + Instalar trackers + Ajustes de trackers + Vaciar almacén + Seleccionar buscador + No hay buscador externo. Instale uno primero. + From 89409602724e3e3bf9b385b02d95b12665046d62 Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Sun, 22 Jan 2017 13:22:46 +0100 Subject: [PATCH 114/126] Update addon.xml --- addon.xml | 147 ++++++++++++++---------------------------------------- 1 file changed, 37 insertions(+), 110 deletions(-) diff --git a/addon.xml b/addon.xml index be3cfaf..9f604cb 100644 --- a/addon.xml +++ b/addon.xml @@ -1,110 +1,37 @@ - - - Idioma de la interfaz - Fijar estilo visual - No fijar - Directorio de descarga de archivos (no FAT32) - Utilizar enlaces magnet - Almacenaje de archivos descargados - Seguir compartiendo archivos descargados - Máx. vel. de subida en mbps (0 = ilimitada) - Máx. vel. de descarga en mbps (0 = ilimitada) - Utilizar solo libtorrent - Predescargar y reproducir episodio siguiente - Descargar metadatos de listas de contenido - Depuración (Modo desarrollador) - Confluence (de slng) - Transperency (de slng) - Confluence (de DiMartino) - Confluence (de RussakHH) - Habilitar historial de búsquedas - python-libtorrent - Ace Stream - Reproductor P2P - Restablecer ajustes en Add-ons de programas -- AceStream client - Duración de las búsquedas - Corta (10 s) - Normal (20 s) - Larga (30 s) - Descargar antes los subtítulos de todos los directorios - Seguir compartiendo después de reproducir el vídeo - Preguntar para cambiar de almacén antes de la descarga - Borrar material en ruso - Restituir material en ruso - Efecto de clic sobre torrent - Abrir archivo torrent - Abrir menú contextual - Descargar vía cliente BitTorrent - Descargar vía python-libtorrent - Ordenar resultados por semillas - Frase para búsqueda personalizada - Cifrado - Número de hilos de búsqueda - Borrar archivos - Guardar archivos - Preguntar para guardar - Torrent2HTTP (libtorrent vía HTTP) - Desbloqueo automático de proxy - Ninguno - Anti-zapret (antirestricción) - Inmunidad - Núm. máx. de conexiones (0 = ilimitadas) - Utilizar puertos aleatorios - Puerto para conexiones entrantes - Tamaño de precarga para empezar a reproducir (MB) - No autoreproducir episodio siguiente (o preguntar) - Configuración de dispositivo - Promedio/Buen PC - Por debajo de la media, PC/router - Tamaño mínimo de almacenaje para autoborrado (GB) - Pausar vídeo tras el inicio - Ordenar resultados de la búsqueda - Por semillas - No ordenar - Por nombre - Añadir a historial de vistos después del (%) - Confluence (de safonov_ivan) - Aeon Nox (de joyrider) - pyrrent2http (python-libtorrent vía HTTP) - Añadir tamaño a nombre de archivo - Activar protocolo DHT - Estuary (de DiMartino) - Modo presentación de datos - Al final - Al principio - En segunda línea - Arctic: Zephyr (de xbmc00) - Interfaz - Red P2P - Avanzado - Cliente de BitTorrent - Hentai (reajustes) - Modo ventana de búsqueda - Habilitar ocultar estilo anterior - Habilitar reponer estilo anterior - Habilitar optativo - Deshabilitar - Fondo transparente de ventana de búsqueda - Desactivar notificaciones - Ruta para guardar - Preguntar - Por defecto - Ruta - Crear subdirectorio para scrapper - Host - Puerto - URL - Usuario - Contraseña - Cliente de BitTorrent - URL (no SSL) - Sustitución de ruta (solo remoto) - Cerrar - Abrir ajustes - Navegador de cliente BitTorrent - Instalar trackers - Ajustes de trackers - Vaciar almacén - Seleccionar buscador - No hay buscador externo. Instale uno primero. - + + + + + + + + + + + + + + video + + + all + Plugin helps you to watch videos from p2p torrent-networks, without full predownload. + + It also can add, control torrents and play downloaded files with external torrent-client (uTorrent, Transmisson, Vuse, Deluge, qBittorrent) or python-libtorrent. + + GNU GPLv3 http://www.gnu.org/licenses/ + Плагин позволяет просматривать видео из пиринговых торрент-сетей, не дожидаясь полного скачивания. + + Так же плагин может добавлять, проигрывать и управлять скачками в торрент клиентах (uTorrent, Transmisson, Deluge и Vuse, qBittorrent) или средставми python-libtorrent. + + GNU GPLv3 http://www.gnu.org/licenses/ + Complemento que nos permite reproducir archivos de vídeo que se comparten en redes BitTorrent, sin necesidad de descargarlos previamente por completo. + + También gestiona torrents y nos deja elegir entre su propio cliente interno y otros externos (μTorrent, Transmission, Deluge, Vuze, qBittorrent), el cliente BitTorrent con el que realizar las descargas. + + https://forums.tvaddons.ag/addon-releases/29224-torrenter-v2.html + http://xbmc.ru/forum/showthread.php?t=6837 + skype:kyonkodura + https://github.com/DiMartinoXBMC/plugin.video.torrenter + + From 6384f58b016632c3eb21b227ce3f9b67fd5315fe Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Sun, 22 Jan 2017 13:23:56 +0100 Subject: [PATCH 115/126] Update strings.xml --- resources/language/spanish/strings.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/language/spanish/strings.xml b/resources/language/spanish/strings.xml index 32fc6b7..fd4864d 100644 --- a/resources/language/spanish/strings.xml +++ b/resources/language/spanish/strings.xml @@ -1,8 +1,8 @@ Idioma de la interfaz - Conservar estilo vista de directorios - No conservar + Fijar estilo visual + No fijar Directorio de descarga de archivos (no FAT32) Utilizar enlaces magnet Almacenaje de archivos descargados @@ -10,7 +10,7 @@ Máx. vel. de subida en mbps (0 = ilimitada) Máx. vel. de descarga en mbps (0 = ilimitada) Utilizar solo libtorrent - Predescargar y reproducir episodio siguiente + Lanzar descarga de episodio siguiente Descargar metadatos de listas de contenido Depuración (Modo desarrollador) Confluence (de slng) @@ -28,7 +28,7 @@ Larga (30 s) Descargar antes los subtítulos de todos los directorios Seguir compartiendo después de reproducir el vídeo - Preguntar para cambiar de almacén antes de la reproducción + Preguntar para cambiar de almacén antes de la descarga Borrar material en ruso Restituir material en ruso Efecto de clic sobre torrent @@ -52,7 +52,7 @@ Utilizar puertos aleatorios Puerto para conexiones entrantes Tamaño de precarga para empezar a reproducir (MB) - Autoreproducir episodio siguiente (o preguntar) + Autorreproducir episodio siguiente (o preguntar) Configuración de dispositivo Promedio/Buen PC Por debajo de la media, PC/router @@ -62,11 +62,11 @@ Por semillas No ordenar Por nombre - No añadir a vistos si no se reprodujo más de (%) + Añadir a historial de vistos después del (%) Confluence (de safonov_ivan) Aeon Nox (de joyrider) pyrrent2http (python-libtorrent vía HTTP) - Añadir tamaño al nombre del archivo + Añadir tamaño a nombre de archivo Activar protocolo DHT Estuary (de DiMartino) Modo presentación de datos From daad65ea6f1cfe637e2239f5f33a05082253ae1e Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Sun, 22 Jan 2017 14:19:07 +0100 Subject: [PATCH 116/126] Update Spanish translation. Added untranslated strings. General update. --- resources/language/spanish/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/language/spanish/strings.xml b/resources/language/spanish/strings.xml index fd4864d..6d478bd 100644 --- a/resources/language/spanish/strings.xml +++ b/resources/language/spanish/strings.xml @@ -107,4 +107,5 @@ Vaciar almacén Seleccionar buscador No hay buscador externo. Instale uno primero. + From 719e15efe830210387cb405bf8cbaf028371861a Mon Sep 17 00:00:00 2001 From: DiMartinoXBMC Date: Wed, 22 Feb 2017 15:02:46 +0300 Subject: [PATCH 118/126] fixes --- Core.py | 3 ++- SearcherABC.py | 10 ++++++---- functions.py | 2 +- searchwindow.py | 36 ++++++++++++++++++++++-------------- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/Core.py b/Core.py index ba8076c..82302d1 100644 --- a/Core.py +++ b/Core.py @@ -296,6 +296,7 @@ class Core: lockView('wide') def test(self, params={}): + pass import searchwindow params = {'mode': 'file_browser', 'path':'D:\\', 'tdir':'D:\\FRAPS\\'} searchwindow.main(params) @@ -593,7 +594,7 @@ class Core: #for favbool, bbstring in favlist: for addtime, filename, foldername, path, url, seek, length, ind, size in items: seek = int(seek) if int(seek) > 3*60 else 0 - watchedPercent = int((float(seek) / float(length)) * 100) + watchedPercent = int((float(seek) / float(length if length else 1)) * 100) duration = '%02d:%02d:%02d' % ((length / (60*60)), (length / 60) % 60, length % 60) title = '[%d%%][%s] %s [%d MB]' %\ (watchedPercent, duration, filename.encode('utf-8'), int(size)) diff --git a/SearcherABC.py b/SearcherABC.py index 6d4b16f..9b49903 100644 --- a/SearcherABC.py +++ b/SearcherABC.py @@ -37,6 +37,7 @@ from functions import log, debug, showMessage import ssl +#ssl._create_default_https_context = ssl._create_unverified_context class SearcherABC: searchIcon = '/icons/video.png' sourceWeight = 1 @@ -116,11 +117,12 @@ class SearcherABC: showMessage('AntiZapret', Localization.localize('Error')) self.debug('[antizapret]: OFF!') # python ssl Context support - PEP 0466 - if hasattr(ssl, '_create_unverified_context'): - ssl_context = ssl._create_unverified_context() + if 'https:' in url: + ssl_context = ssl.create_default_context() + ssl_context.check_hostname = False + ssl_context.verify_mode = ssl.CERT_NONE + log('urllib2.HTTPSHandler(context=ssl_context)') opener.add_handler(urllib2.HTTPSHandler(context=ssl_context)) - else: - opener.add_handler(urllib2.HTTPSHandler()) opener.addheaders = headers if 0 < len(data): diff --git a/functions.py b/functions.py index 12990a9..9d93a70 100644 --- a/functions.py +++ b/functions.py @@ -1080,7 +1080,7 @@ class WatchedHistoryDB: def add(self, filename, path, foldername = None, seek = 0, length = 1, ind = 0, size = 0): try: - watchedPercent = int((float(seek) / float(length)) * 100) + watchedPercent = int((float(seek) / float(length if length else 1)) * 100) except: watchedPercent = 0 max_history_add = int(__settings__.getSetting('max_history_add')) diff --git a/searchwindow.py b/searchwindow.py index e3caecf..e6403fd 100644 --- a/searchwindow.py +++ b/searchwindow.py @@ -110,18 +110,18 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.button_downloadstatus = pyxbmct.Button("", focusTexture=self.icon % 'fdownloadstatus', noFocusTexture=self.icon % 'nfdownloadstatus') - self.placeControl(self.button_downloadstatus, 0, 2, 1, 1) + self.placeControl(self.button_downloadstatus, 0, 1, 1, 1) self.button_browser = pyxbmct.Button("", focusTexture=self.icon_tc % 'f', noFocusTexture=self.icon_tc % 'nf') - self.placeControl(self.button_browser, 0, 3, 1, 1) + self.placeControl(self.button_browser, 0, 2, 1, 1) self.button_controlcenter = pyxbmct.Button("", focusTexture=self.icon % 'fcontrolcenter', noFocusTexture=self.icon % 'nfcontrolcenter') - self.placeControl(self.button_controlcenter, 0, 4, 1, 1) - #self.button_keyboard = pyxbmct.Button("", focusTexture=self.icon % 'fkeyboard', - # noFocusTexture=self.icon % 'nfkeyboard') - #self.placeControl(self.button_keyboard, 0, 3, 1, 1) + self.placeControl(self.button_controlcenter, 0, 3, 1, 1) + self.button_filter = pyxbmct.Button("", focusTexture=self.icon % 'fkeyboard', + noFocusTexture=self.icon % 'nfkeyboard') + self.placeControl(self.button_filter, 0, 4, 1, 1) self.input_search = pyxbmct.Edit("", _alignment=pyxbmct.ALIGN_CENTER_X | pyxbmct.ALIGN_CENTER_Y) self.placeControl(self.input_search, 0, 5, 1, 6) self.button_search = pyxbmct.Button("", focusTexture=self.icon % 'fsearch', @@ -153,6 +153,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): self.connect(self.button_browser, self.browser) self.connect(self.button_downloadstatus, self.downloadstatus) self.connect(self.button_watched, self.watched) + self.connect(self.button_filter, self.filter) self.connect(pyxbmct.ACTION_NAV_BACK, self.navi_back) self.connect(pyxbmct.ACTION_PREVIOUS_MENU, self.navi_back) @@ -172,9 +173,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): # Top menu self.button_browser.setNavigation(self.window_close_button, self.listing, self.button_downloadstatus, self.button_controlcenter) - self.button_controlcenter.setNavigation(self.window_close_button, self.listing, self.button_browser, self.input_search) - #self.button_keyboard.setNavigation(self.listing, self.listing, self.button_browser, self.input_search) - self.input_search.setNavigation(self.window_close_button, self.listing, self.button_controlcenter, self.button_search) + self.button_controlcenter.setNavigation(self.window_close_button, self.listing, self.button_browser, self.button_filter) + self.button_filter.setNavigation(self.window_close_button, self.listing, self.button_controlcenter, self.input_search) + self.input_search.setNavigation(self.window_close_button, self.listing, self.button_filter, self.button_search) self.button_search.setNavigation(self.window_close_button, self.listing, self.input_search, self.button_history) self.button_history.setNavigation(self.window_close_button, self.listing, self.button_search, self.button_watched) self.update_navigation() @@ -243,10 +244,9 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if not xbmcvfs.exists(navi_file): self.set_navi() self.navi['route'].append({"last_listing_item": 0, "params": {}, "mode": "history"}) - with open(xbmc.translatePath(navi_file), 'w') as f: f.write(json.dumps(self.navi)) - read = xbmcvfs.File(navi_file, 'r') - navi = read.read() - read.close() + with open(navi_file, 'w') as f: f.write(json.dumps(self.navi)) + + with open(navi_file, 'r') as read: navi = read.read() try: debug('navi_load navi: '+str(navi)) @@ -500,7 +500,7 @@ class SearchWindow(pyxbmct.AddonDialogWindow): if items: for addtime, filename, foldername, path, url, seek, length, ind, size in items: seek = int(seek) if int(seek) > 3*60 else 0 - watchedPercent = int((float(seek) / float(length)) * 100) + watchedPercent = int((float(seek) / float(length if length else 1)) * 100) duration = '%02d:%02d:%02d' % ((length / (60*60)), (length / 60) % 60, length % 60) title = '[%d%%][%s] %s [%d MB]' %\ (watchedPercent, duration, filename.encode('utf-8'), int(size)) @@ -1251,6 +1251,14 @@ class SearchWindow(pyxbmct.AddonDialogWindow): def version_check(self): return False if int(xbmc.getInfoLabel("System.BuildVersion")[:2]) < 17 else True + def filter(self): + list = self.listing + self.listing.setPageControlVisible(True) + size = self.listing.size() + if size > 0: + for index in range(0, size): + listitem = self.listing.getListItem(index) + class InfoWindow(pyxbmct.AddonDialogWindow): def __init__(self, title="", year=""): super(InfoWindow, self).__init__(title) From 64f627ac78badb7f1a9b571a7d65e1b2f0385571 Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Wed, 1 Mar 2017 19:49:14 +0100 Subject: [PATCH 119/126] Update Localization.py Update Spanish dictionary --- Localization.py | 384 ++++++++++++++++++++++++------------------------ 1 file changed, 192 insertions(+), 192 deletions(-) diff --git a/Localization.py b/Localization.py index e535ff5..277605e 100644 --- a/Localization.py +++ b/Localization.py @@ -32,265 +32,265 @@ except: def localize(text): dictionary = { 'es': { - 'Seeds searching.': 'Búsqueda de seeds', - 'Please Wait': 'Por favor espere', + 'Seeds searching.': 'Búsqueda de fuentes', + 'Please Wait': 'Espere', 'Information': 'Información', - 'Torrent downloading is stopped.': 'La descarga del torrent se detuvo', + 'Torrent downloading is stopped.': 'Se detuvo la descarga del torrent', 'Search': 'Buscar', - 'Seeds': 'Seeds', - 'Peers': 'Peers', - 'Materials are loading now.': 'Los materiales estan cargando', - 'Search Phrase': 'Expresión de búsqueda', - 'Magnet-link is converting': 'El Link Magnetico se esta convirtiendo', + 'Seeds': 'Semillas', + 'Peers': 'Pares', + 'Materials are loading now.': 'Los materiales se están descargando', + 'Search Phrase': 'Términos de búsqueda', + 'Magnet-link is converting': 'Se está convirtiendo el enlace magnet', 'Error': 'Error', - 'Your library out of date and can\'t save magnet-links.': 'Tu Colección es antigüa y no puede guardar links magneticos ', + 'Your library out of date and can\'t save magnet-links.': 'Su colección está anticuada y no pueden guardarse enlaces magnet.', 'Bookmarks': 'Favoritos', - 'Logout': 'Salir', - 'Login': 'Login', + 'Logout': 'Cerrar sesión', + 'Login': 'Iniciar sesión', 'Recent Materials': 'Materiales recientes ', 'Register': 'Registrar', 'Bookmark': 'Favorito', - 'Item successfully added to Bookmarks': 'El ítem se ha añadido a Favoritos', - 'Item successfully removed from Bookmarks': 'El ítem se ha eliminado de Favoritos', - 'Bookmark not added': 'El favorito no se ha añadido', - 'Bookmark not removed': 'El favorito no se ha eliminado', - 'Add To Bookmarks': 'Añadir a favoritos', - 'Remove From Bookmarks': 'Eliminar de favoritos', - 'Auth': 'Autenticación', - 'Already logged in': 'Acgtualmente autenticado', - 'Input Email (for password recovery):': 'Ingrese Email (para recuperación de contraseña):', - 'Input Email:': 'Ingrese Email:', - 'Input Password (6+ symbols):': 'Ingrese Password (6+ carateres):', - 'Input Password:': 'Ingrese Password', - 'Login successfull': 'Autenticación exitosa', - 'Login failed': 'Falló la autenticación', - 'User not logged in': 'Usuario no autenticado', - 'User successfully logged out': 'El usuario ha salido con éxito', - 'Preloaded: ': 'Pre-carga', - 'Do you want to STOP torrent downloading and seeding?': 'Desea detener la descarga del torrent y el seeding?', + 'Item successfully added to Bookmarks': 'El elemento se ha añadido a "Favoritos"', + 'Item successfully removed from Bookmarks': 'El elemento se ha eliminado de "Favoritos"', + 'Bookmark not added': 'No se ha añadido a "Favoritos"', + 'Bookmark not removed': 'No se ha eliminado de "Favoritos"', + 'Add To Bookmarks': 'Añadir a "Favoritos"', + 'Remove From Bookmarks': 'Eliminar de "Favoritos"', + 'Auth': 'Validación', + 'Already logged in': 'Ya se había iniciado sesión', + 'Input Email (for password recovery):': 'Introduzca correo electrónico (para recuperar contraseña):', + 'Input Email:': 'Introduzca correo electrónico:', + 'Input Password (6+ symbols):': 'Introduzca contraseña (más de 6 caracteres):', + 'Input Password:': 'Introduzca contraseña', + 'Login successfull': 'Se ha iniciado sesión', + 'Login failed': 'Falló el inicio de sesión', + 'User not logged in': 'El usuario no ha iniciado sesión', + 'User successfully logged out': 'El usuario ha cerrado sesión', + 'Preloaded: ': 'Carga previa: ', + 'Do you want to STOP torrent downloading and seeding?': '¿Desea detener la descarga y dejar de compartir el torrent?', 'Torrent Downloading': 'Descarga de torrent', - 'Auth expired, please relogin': 'Autenticación expirada, por favor vuelva a ingresar', - 'Storage': 'Almacenamiento', - 'Storage has been cleared': 'El almacenamiento se ha limpiado', - 'Clear Storage': 'Limpiar almacenamiento', + 'Auth expired, please relogin': 'Expiró la identificación; vuelva a identificarse', + 'Storage': 'Almacén', + 'Storage has been cleared': 'El almacén se ha vaciado', + 'Clear Storage': 'Vaciar almacén', 'Popular': 'Popular', 'Views': 'Vistas', - 'Uploading': 'Subida', - 'Download': 'Descarga', - 'Input symbols from CAPTCHA image:': 'Ingrese los simpobos de la CAPTCHA:', - 'Please, rate watched video:': 'Por favor, valore el video que acaba de ver:', + 'Uploading': 'Subiendo', + 'Download': 'Descargar', + 'Input symbols from CAPTCHA image:': 'Introduzca los caracteres que aparecen en la imagen:', + 'Please, rate watched video:': 'Valore el vídeo que ha visto:', 'Bad': 'Malo', - 'So-So': 'Ni fu Ni fa', + 'So-So': 'Regular', 'Good': 'Bueno', 'Ratings': 'Valoraciones', 'Rating': 'Valoración', 'Retry': 'Reintentar', '%ds has left': '%ds ha dejado', - 'File failed to play! Do you want to RETRY and buffer more?': 'Falló la reproducción! Desea reintentar y aumentar el buffer?', - 'High Priority Files': 'Archivos de alta prioridad', + 'File failed to play! Do you want to RETRY and buffer more?': 'Falló la reproducción del archivo. ¿Desea volver a intentarlo y aumentar el tamaño de búfer?', + 'High Priority Files': 'Archivos de prioridad alta', 'Skip All Files': 'Omitir todos los archivos', 'Start': 'Iniciar', 'Stop': 'Detener', 'Play':'Reproducir', - 'High Priority': 'Alta prioridad', + 'High Priority': 'Prioridad alta', 'Skip File': 'Omitir archivo', 'Remove': 'Eliminar', - 'Remove with files': 'Eliminar (con archivos)', - 'Play File': 'Reproducir Archivo', + 'Remove with files': 'Eliminar con los archivos', + 'Play File': 'Reproducir archivo', 'Start All Files': 'Iniciar todos los archivos', 'Stop All Files': 'Detener todos los archivos', - 'Torrent-client Browser': 'Navegador de Cliente Torrent', - 'Remote Torrent-client': 'Cliente de Torrent remoto', - 'You didn\'t set up replacement path in setting.': 'No ha configurado una ruta de reemplazo en la configuración.', - 'For example /media/dl_torr/ to smb://SERVER/dl_torr/. Setup now?': 'Por ejemplo /media/dl_torr/ a smb://SERVER/dl_torr/. Desea configurarla ahora?', - 'Manual Torrent-client Path Edit': 'Edicion manual de la ruta del cliente torrent', - 'Choose .torrent in video library': 'Elija el .torrent en la Colección de Video', - '.torrent Player': 'Reproductor de .torrent', - 'Choose directory:': 'Elegir directorio:', - 'Starting download next episode!': 'Comenzando a descargar el próximo episodio!', + 'Torrent-client Browser': 'Navegador de cliente de BitTorrent', + 'Remote Torrent-client': 'Cliente de BitTorrent remoto', + 'You didn\'t set up replacement path in setting.': 'No se ha establecido una ruta alternativa en "Ajustes".', + 'For example /media/dl_torr/ to smb://SERVER/dl_torr/. Setup now?': 'Por ejemplo, /media/dl_torr/ a smb://SERVER/dl_torr/. ¿Desea ajustarla ahora?', + 'Manual Torrent-client Path Edit': 'Edición manual de la ruta del cliente de BitTorrent', + 'Choose .torrent in video library': 'Seleccione archivo .torrent en la colección de vídeos', + '.torrent Player': 'Gestor de archivo .torrent', + 'Choose directory:': 'Seleccionar directorio:', + 'Starting download next episode!': '¡Iniciando la descarga del capítulo siguiente!', 'Choose in torrent-client:': 'Elija cliente torrent', - 'Search Control Window': 'Centro de Control de Busqueda', - 'Magnet-link (magnet:...)': 'Link Magnetico (magnet:...)', - 'Not a magnet-link!': 'No es un link magnetico', - 'Magnet-link Player': 'Reproductor de link magnetico', + 'Search Control Window': 'Ventana de control de búsquedas', + 'Magnet-link (magnet:...)': 'Enlace magnet (magnet:...)', + 'Not a magnet-link!': 'No es un enlace magnet', + 'Magnet-link Player': 'Gestor de enlace magnet', 'UNKNOWN STATUS': 'ESTADO DESCONOCIDO', - 'Checking preloaded files...': 'Chequeando archivos pre-cargados', - 'Waiting for website response...': 'Esperando respuesta del sitio---', - 'Search and cache information for:': 'Buscar y cachear información para:', - 'Open Torrent': 'Abrir Torrent', - 'Torrent list is empty.': 'La lista de torrent esta vacía', - 'Content Lists': 'Listas de Contenido', - 'Canceled by User': 'Cancelado por el Usuario', - 'Do you want to search and cache full metadata + arts?': 'Desea bucar y cachear el arte+ metadata por completo?', - 'This vastly decreases load speed, but you will be asked to download premade bases!': 'Esto incrementará la velocidad de carga, pero se le pregutnará si descargar premade bases!', - 'Do you want to preload full metadata?': 'Desea pre-cargar metadata por completo?', - 'It is highly recommended!': 'מומלץ', - 'TV Shows': 'Series de TV', - 'Cartoons': 'Cartoons', + 'Checking preloaded files...': 'Comprobando archivos precargados', + 'Waiting for website response...': 'Esperando respuesta del sitio web...', + 'Search and cache information for:': 'Buscar y almacenar datos para:', + 'Open Torrent': 'Abrir torrent', + 'Torrent list is empty.': 'La lista de torrent está en blanco', + 'Content Lists': 'Listas de contenido', + 'Canceled by User': 'Cancelado por el usuario', + 'Do you want to search and cache full metadata + arts?': '¿Desea buscar y almacenar los metadatos y fan-arts completos?', + 'This vastly decreases load speed, but you will be asked to download premade bases!': 'Esto reduce considerablemente la velocidad de carga. Pero se le preguntará si desea descargar desde cero', + 'Do you want to preload full metadata?': '¿Desea precargar los metadatos completos?', + 'It is highly recommended!': '¡Altamente recomendado!', + 'TV Shows': 'Series de televisión', + 'Cartoons': 'Dibujos animados', 'Anime': 'Anime', - 'Most Recent': 'Mas Recientes', - 'Top 250 Movies': 'Películas Top 250', - 'Top All Time': 'Top Histórico', - 'by Genre': 'por Género', - 'by Year': 'por Año', + 'Most Recent': 'Estrenos', + 'Top 250 Movies': 'Las 250 mejores películas', + 'Top All Time': 'Las mejores de todos los tiempos', + 'by Genre': 'por género', + 'by Year': 'por año', 'Action': 'Acción', - 'Adventure': 'Aventura', + 'Adventure': 'Aventuras', 'Animation': 'Animación', - 'Biography': 'Biografía', + 'Biography': 'Biografías', 'Comedy': 'Comedia', - 'Crime': 'Policial', - 'Documentary': 'Docuemntal', + 'Crime': 'Policiaca', + 'Documentary': 'Documentales', 'Drama': 'Drama', - 'Family': 'Familiar', + 'Family': 'Todos los públicos', 'Fantasy': 'Fantasía', - 'Film-Noir': 'Film-Noir', + 'Film-Noir': 'Cine negro', 'History': 'Historia', 'Horror': 'Terror', 'Music': 'Música', - 'Musical': 'Musical', + 'Musical': 'Musicales', 'Mystery': 'Misterio', - 'Romance': 'Romance', - 'Sci-Fi': 'Ciencia Ficción', + 'Romance': 'Románticas', + 'Sci-Fi': 'Ciencia ficción', 'Short': 'Cortos', 'Sport': 'Deportes', - 'Thriller': 'Thriller', + 'Thriller': 'Suspense', 'War': 'Bélicas', - 'Western': 'Western', - '[B]by Site[/B]': '[B]por Sitio[/B]', - 'Cartoons Series': 'Series de Carrtons', - 'Cartoons Short': 'Series de Cortos', - 'Male': 'Masculino', - 'Female': 'Femenino', - 'Russia & USSR': 'Rusia & USSR', - 'Next Page': 'Página Siguiente', - 'Previous Page': 'Página Enterior', - 'Russian Movies': 'Películas Rusas', - 'israeli Movies': 'Películas Israelies', - 'hebdub movies': 'peliculas hebdub', + 'Western': 'Películas del Oeste', + '[B]by Site[/B]': '[B]por sitio[/B]', + 'Cartoons Series': 'Series de dibujos animados', + 'Cartoons Short': 'Cortos de dibujos animados', + 'Male': 'Hombre', + 'Female': 'Mujer', + 'Russia & USSR': 'Rusia & URSS', + 'Next Page': 'Página siguiente', + 'Previous Page': 'Página anterior', + 'Russian Movies': 'Películas rusas', + 'israeli Movies': 'Películas israelíes', + 'hebdub movies': 'Películas dobladas al hebreo', 'Movies': 'Películas', - 'High Resolution Movies': 'Peliculas en HD', + 'High Resolution Movies': 'Películas en alta resolución', '3D Movies': 'Películas en 3D', - 'Movies [Bluray]': 'Películas [Bluray]', + 'Movies [Bluray]': 'Películas en formato Blu-ray', 'Anime Film': 'Películas Anime', 'Anime Series': 'Series Anime', - 'Can\'t download torrent, probably no seeds available.': 'No se puede descargar el torrent, probablemente no halla seed disponibles.', - 'Personal List': 'Lista Personal', + 'Can\'t download torrent, probably no seeds available.': 'No se puede descargar el torrent, probablemente no hay fuentes disponibles.', + 'Personal List': 'Lista personal', 'Add to %s': 'Añadir a %s', 'Delete from %s': 'Eliminar de %s', - 'Added!': 'Añadido!', - 'Deleted!': 'Eliminado!', - 'Search History': 'Historial de búsqueda', + 'Added!': '¡Añadido!', + 'Deleted!': '¡Eliminado!', + 'Search History': 'Historial de búsquedas', ' History ':' Historial ', - 'Torrent History':'Historial de Torrent', - 'Watched History':'Historial de Vistos', + 'Torrent History':'Historial de archivos torrent', + 'Watched History':'Historial de vistos', 'Favourites': 'Favoritos', 'Favourites SH': 'Favoritos SH', - 'Clear %s': 'Limpiar %s', - 'Clear!': 'Limpieza exitosa!', - 'kb/s': 'kb/s', - 'Queued': 'En Cola', - 'Checking': 'Chequeando', - 'Downloading metadata': 'Descargando Metadata', - 'Downloading': 'Descargado', + 'Clear %s': 'Vaciar %s', + 'Clear!': '¡Vacío!', + 'kb/s': 'kbps', + 'Queued': 'Situado en cola', + 'Checking': 'Comprobando', + 'Downloading metadata': 'Descargando metadatos', + 'Downloading': 'Descargando', 'Finished': 'Finalizado', 'Seeding': 'Compartiendo', - 'Allocating': 'Asignando', - 'Allocating file & Checking resume': 'Asignando archivo & chequeando resumen', - 'For Kids': 'Para Niños', + 'Allocating': 'Reservando espacio', + 'Allocating file & Checking resume': 'Reservando espacio y comprobando reanudación', + 'For Kids': 'Para niños', 'Adult': 'Adultos', - 'Does not support magnet links!': 'No soporta Links Magneticos!', - 'Reset All Cache DBs': 'Resetear el cache de las BD', + 'Does not support magnet links!': '¡No compatible con enlaces magnet!', + 'Reset All Cache DBs': 'Reiniciar todas las bases de datos de la caché', '[B]Search[/B]': '[B]Buscar[/B]', - 'You can always restart this by deleting DBs via Context Menu': 'Siempre puedes reiniciar esto eliminando las DB en el menú contextual', - 'Your preloaded databases are outdated!': 'Tus Base de Datos precargadas son demasiado antigüas!', - 'Do you want to download new ones right now?': 'Desea descargar ahora versiones mas recientes?', - 'Individual Tracker Options':'Opciones Individuales de Tracker', - 'Downloading and copy subtitles. Please wait.':'Descargando y copiando subtitulos. Por favor espere.', - 'International Check - First Run':'Chequeo Internacional. Primera ejecución.', - 'Delete Russian stuff?':'Eliminar artículos rusos?', - 'Save to path':'Guardar a directorio', - 'Return Russian stuff':'Devolver artículos rusos', - '%d files have been returned':'%d archivos fueron devueltos', - 'Download via T-client':'Descargar via Cliente-T', - 'Download via Libtorrent':'Descargar via Libtorrent', - 'Download Status':'Estado de Descarga', - 'Download has not finished yet':'La descarga aun no ha finalizado', - 'Stopped and Deleted!':'Detenido y Eliminado', - 'Unpaused!':'De-pausado', + 'You can always restart this by deleting DBs via Context Menu': 'Siempre se puede reiniciar eliminando las bases de datos a través del menú contextual', + 'Your preloaded databases are outdated!': '¡Las bases de datos precargadas han quedado anticuadas!', + 'Do you want to download new ones right now?': '¿Desea descargar versiones actualizadas?', + 'Individual Tracker Options':'Opciones individuales del rastreador', + 'Downloading and copy subtitles. Please wait.':'Descargando y copiando subtítulos. Espere.', + 'International Check - First Run':'Comprobación internacional - Primera ejecución.', + 'Delete Russian stuff?':'¿Desea eliminar las cosas de Rusia?', + 'Save to path':'Ruta para guardar', + 'Return Russian stuff':'Devolver las cosas de Rusia', + '%d files have been returned':'Han vuelto %d archivos', + 'Download via T-client':'Descargar a través de cliente de BitTorrent', + 'Download via Libtorrent':'Descargar a través de Libtorrent', + 'Download Status':'Estado de la descarga', + 'Download has not finished yet':'La descarga no ha terminado todavía', + 'Stopped and Deleted!':'Detenido y eliminado', + 'Unpaused!':'Despausado', 'Paused!':'Pausado', 'Stopped!':'Detenido', 'Started!':'Iniciado', - 'Delete and Stop':'Eliminado y detenido', - 'Unpause':'Des-pausar', + 'Delete and Stop':'Eliminar y detener', + 'Unpause':'Despausar', 'Pause':'Pausar', 'Delete':'Eliminar', 'Open':'Abrir', - 'Torrent is seeding. To stop it use Download Status.':'El toorrent esta siendo compartido. Para detenerlo, utiliza el dialogo de descarga.', - 'Start All':'Iniciar Todo', - 'Started All!':'Todo ha sido iniciado', - 'Stopped All!':'Todo ha sido detenido', + 'Torrent is seeding. To stop it use Download Status.':'El torrent se está compartiendo. Para detenerlo utilice "Estado de la descarga".', + 'Start All':'Iniciar todo', + 'Started All!':'¡Se ha iniciado todo!', + 'Stopped All!':'¡Se ha detenido todo!', 'Stop All':'Detener todo', 'Keyboard':'Teclado', - 'Copy Files in Root':'Copiar archivos en la Raiz del sistema', - 'Copied %d files!':'Se han copiado %d archivos!', + 'Copy Files in Root':'Copiar archivos en directorio personal de root (/root)', + 'Copied %d files!':'¡Se han copiado %d archivos!', 'Add to MyShows.ru':'Añadir a MyShows.ru', - 'Return to MyShows.ru':'Retornar a MyShows.ru', - 'Search results:':'Resultados de búsqueda', - 'by Seeders':'por Seeders', + 'Return to MyShows.ru':'Volver a MyShows.ru', + 'Search results:':'Resultados de la búsqueda', + 'by Seeders':'por fuentes', 'by Date':'por fecha', - 'Sort':'Orden', + 'Sort':'Ordenar', 'Close':'Cerrar', 'Views:':'Vistas:', 'Rating:':'Valoración:', - 'Information not found!':'Información no encontrada', - 'Choose searcher':'Elija Buscador', - 'python-libtorrent Not Found':'python-libtorrent no encontrado', - 'Windows has static compiled python-libtorrent included.':'Windows ya incluye una version de python-libtorrent compilada estáticamente', - 'You should install "script.module.libtorrent" from "MyShows.me Kodi Repo"':'Debes instalar "script.module.libtorrent" de "MyShows.me Kodi Repo', - 'Linux x64 has not static compiled python-libtorrent included.':'Linux x64 no incluye una version de python-libtorrent compilada estáticamente', - 'You should install it by "sudo apt-get install python-libtorrent"':'Debes instalarlo con el comando "sudo apt-get install python-libtorrent"', - 'Linux has static compiled python-libtorrent included but it didn\'t work.':'Linux x86 ya incluye una version de python-libtorrent compilada estáticamente, pero no funciónó', - 'As far as I know you can compile python-libtorrent for ARMv6-7.':'Creo que puede compilar python-libtorrent para ARMv6-7.', - 'You should search for "OneEvil\'s OpenELEC libtorrent" or use Ace Stream.':'Deberias buscar "OneEvil\'s OpenELEC libtorrent" o usar Ace Stream', - 'Please use install Ace Stream APK and choose it in Settings.':'Por favor instala Ace Stream APK y seleccionalo en la configuración', - 'It is possible to compile python-libtorrent for Android, but I don\'t know how.':'Es posible compilar python-libtorrent en Android pero desconozco el procedimiento.', - 'It is possible to compile python-libtorrent for OS X.':'Es posible compilar python-libtorrent para OS X.', - 'But you would have to do it by yourself, there is some info on github.com.':'Pero debes hacerlo por tu cuenta, hay información en github.com.', + 'Information not found!':'¡No se ha encontrado información!', + 'Choose searcher':'Elegir buscador', + 'python-libtorrent Not Found':'No se ha encontrado python-libtorrent', + 'Windows has static compiled python-libtorrent included.':'Windows cuenta con una versión de python-libtorrent compilada estáticamente', + 'You should install "script.module.libtorrent" from "MyShows.me Kodi Repo"':'Se debe instalar el módulo "script.module.libtorrrent" que se encuentra en el repositorio "MyShows.me"', + 'Linux x64 has not static compiled python-libtorrent included.':'Linux x64 no cuenta con una versión de python-libtorrent compilada estáticamente', + 'You should install it by "sudo apt-get install python-libtorrent"':'Se debe instalar con "sudo apt-get install python-libtorrent"', + 'Linux has static compiled python-libtorrent included but it didn\'t work.':'Linux cuenta con una version de python-libtorrent compilada estáticamente, pero no ha funcionado', + 'As far as I know you can compile python-libtorrent for ARMv6-7.':'Por lo que yo sé, se puede compilar para ARMv6-7.', + 'You should search for "OneEvil\'s OpenELEC libtorrent" or use Ace Stream.':'Se debe buscar "OpenELEC libtorrent de OneEvil" o utilizar Ace Stream', + 'Please use install Ace Stream APK and choose it in Settings.':'Instale APK de Ace Stream y selecciónelo en "Ajustes"', + 'It is possible to compile python-libtorrent for Android, but I don\'t know how.':'Es posible compilar python-libtorrent en Android, pero no sé como hacerlo.', + 'It is possible to compile python-libtorrent for OS X.':'Es posible compilar python-libtorrent para Mac OS X.', + 'But you would have to do it by yourself, there is some info on github.com.':'Pero debe hacerlo por sí mismo. Hay alguna información en github.com.', 'It is NOT possible to compile python-libtorrent for iOS.':'No es posible compilar python-libtorrent para iOS', - 'But you can use torrent-client control functions.':'Pero puedes usar las funciones del cliente torrent', - 'I added custom searchers to Torrenter v2!':'He añadido buscadores personalizados a Torrenter v2!', - 'Now you can use your login on trackers or write and install your own searcher!':'Ahora puedes usar tus datos para loguearte en trackers o escribir e instalar tu propio buscador!', - 'Would you like to install %s from "MyShows.me Kodi Repo" in Programs section?':'Deseas instalar %s de "MyShows.me Kodi Repo" en la sección de Programas?', - 'Open installation window?':'Abrir ventana de instalación?', - 'Android Support':'Soporte Android', - 'Android has no temprorary folder':'Android no contiene directorio temporal', - 'Please specify storage folder in Settings!':'Por favor especifica el directorio de descarga en la configuración!', - 'You have no installed or active searchers! More info in Search Control Window!':'No has instalado o activado ningun buscador! Mas info en el Centro de Control de Búsquedas', - 'Please contact DiMartino on kodi.tv forum. We compiled python-libtorrent for Android,':'Por favor contacta a DiMartino en el foro kodi.tv. Hemos compilado python-libtorrent para Android,', - 'but we need your help with some Torrent is seeding. To stop it use Download Status.s on different processors.':'pero necesitamos tu ayuda cuando el torrent esta siendo compartido. Para detenerlo, usa el estado de descarga según el procesador.', - 'We added Android ARM full support to Torrenter v2!':'Hemos añadido soporte completo de Torrenter v2 para Android ARM!', - 'I deleted pre-installed ones, install them in Search Control Window!':'Se han eliminado los preintalados, instalalos desde el Centro de Control de Búsquedas!', - 'Torrenter didn\'t find %s searcher':'Torrenter no encontró el buscador %s', - 'Torrenter Tracker Install':'Intalacion de Tracker de Torrenter', - 'Ask to save':'Preguntar si guardar', - 'Would you like to save this file?':'Desea guardar este archivo?', - 'Your storage path is not writable or not local! Please change it in settings!':'Su ruta de descarga esta protegida contra escritura o no es local. Por favor cambiala en la configuración!', - 'Upgrade advancedsettings.xml':'Actualizar advancedsettings.xml', - 'We would like to set some advanced settings for you!':'Nos gustaría configurar advanced settings en tu equipo!', - 'Do it!':'Hazlo!', - 'Please, restart Kodi now!':'Por favor, reinicia Kodi ahora', - './ (Root folder)':'./ (Directorio Raíz)', - 'Opening torrent file':'Abriendo archivo Torrent', - 'New player to Torrenter v2 - Torrent2HTTP! It should be faster, stable and better with Android, also seeking works in it.':'Nuevo reproductor para Torrenter v2 - Torrent2HTTP: Es más rápido, estable y mejora la compatibilidad con Android. También funciona la búsqueda.', - 'Would you like to try it?':'Desea probarlo?', - 'Torrent2HTTP enabled! Can be changed in Settings.':'Torrent2HTTP se ha activado! Puede cambiarlo en la configuración.', - 'Seeking':'Buscando', - 'Would you like to resume from %s?':'Desea continuar la reproducción desde %s?', - 'Seeking is working only with player Torrent2HTTP.':'La búsqueda solo funciona con el reproductor Torrent2HTTP.', - 'Play (from %s)':'Reproducir (desde %s)', - 'Play (from start)':'Reproducir (desde el inicio)', + 'But you can use torrent-client control functions.':'Pero se pueden utilizar las funciones de control del cliente de BitTorrent', + 'I added custom searchers to Torrenter v2!':'¡Se han añadido buscadores personalizados a Torrenter v2!', + 'Now you can use your login on trackers or write and install your own searcher!':'¡Ahora puede identificarse en rastreadores o crear e instalar su propio buscador!', + 'Would you like to install %s from "MyShows.me Kodi Repo" in Programs section?':'¿Le gustaría instalar %s desde el repositorio "MyShows.me", sección Programas?', + 'Open installation window?':'¡Abrir la ventana de instalación?', + 'Android Support':'Compatibilidad con Android', + 'Android has no temprorary folder':'Android no tiene carpeta temporal', + 'Please specify storage folder in Settings!':'Establezca la carpeta de almacenamiento en "Ajustes"', + 'You have no installed or active searchers! More info in Search Control Window!':'¡No se han instalado o activado buscadores! Tiene más información en la ventana Control de búsquedas', + 'Please contact DiMartino on kodi.tv forum. We compiled python-libtorrent for Android,':'Póngase en contacto con DiMartino en el foro de kodi.tv. Hemos compilado python-libtorren para Android,', + 'but we need your help with some Torrent is seeding. To stop it use Download Status.s on different processors.':'pero necesitamos su ayuda con algún torrent que se comparta. Para detenerlo utilice Estado de la descarga en diferentes procesadores.', + 'We added Android ARM full support to Torrenter v2!':'¡Hemos añadido compatibilidad completa para Android ARM en Torrenter v2!', + 'I deleted pre-installed ones, install them in Search Control Window!':'Se eliminaron los que estaban preinstalados, ¡instálelos desde la ventana de control de búsquedas!', + 'Torrenter didn\'t find %s searcher':'Torrenter no ha encontrado el buscador %s', + 'Torrenter Tracker Install':'Instalación de rastreador de Torrenter', + 'Ask to save':'Preguntar para guardar', + 'Would you like to save this file?':'¿Le gustaría guardar este archivo?', + 'Your storage path is not writable or not local! Please change it in settings!':'La ruta del almacén está protegida contra escritura o no es local. ¡Cámbiela en "Ajustes"!', + 'Upgrade advancedsettings.xml':'Actualizar archivo advancedsettings.xml', + 'We would like to set some advanced settings for you!':'¡Nos gustaría efectuar algunos ajustes avanzados por usted!', + 'Do it!':'¡Hacedlo!', + 'Please, restart Kodi now!':'Reinicie Kodi', + './ (Root folder)':'./ (Carpeta de root)', + 'Opening torrent file':'Abriendo archivo torrent', + 'New player to Torrenter v2 - Torrent2HTTP! It should be faster, stable and better with Android, also seeking works in it.':'Nuevo reproductor para Torrenter v2 - Torrent2HTTP: Debe ser más rápido, estable y funcionar mejor en Android así como en los intercambios.', + 'Would you like to try it?':'¿Le gustaría probarlo?', + 'Torrent2HTTP enabled! Can be changed in Settings.':'¡Se ha activado Torrent2HTTP! Puede cambiarlo en "Ajustes".', + 'Seeking':'Compartiendo', + 'Would you like to resume from %s?':'¿Desea continuar desde %s?', + 'Seeking is working only with player Torrent2HTTP.':'Compartir solo funciona con el reproductor Torrent2HTTP.', + 'Play (from %s)':'Reproducir desde %s', + 'Play (from start)':'Reproducir desde el inicio', }, - 'he': { + 'he': { 'Seeds searching.': 'חיפוש זורעים', 'Please Wait': 'המתן', 'Information': 'מידע', From a98a239d116e7e2fc0e658f65143cb58f8ea56d4 Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Wed, 1 Mar 2017 19:55:02 +0100 Subject: [PATCH 120/126] Update strings.xml --- resources/language/spanish/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/language/spanish/strings.xml b/resources/language/spanish/strings.xml index 6d478bd..432e5af 100644 --- a/resources/language/spanish/strings.xml +++ b/resources/language/spanish/strings.xml @@ -37,7 +37,7 @@ Descargar vía cliente BitTorrent Descargar vía python-libtorrent Ordenar resultados por semillas - Frase para búsqueda personalizada + Términos para búsqueda personalizada Cifrado Número de hilos de búsqueda Borrar archivos @@ -102,8 +102,8 @@ Cerrar Abrir ajustes Navegador de cliente BitTorrent - Instalar trackers - Ajustes de trackers + Instalar rastreadores + Ajustes de rastreadores Vaciar almacén Seleccionar buscador No hay buscador externo. Instale uno primero. From b58dd82d36d17ce079f3b36a73c6663ee7116a21 Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Tue, 7 Mar 2017 19:23:51 +0100 Subject: [PATCH 121/126] Update strings.xml --- resources/language/spanish/strings.xml | 51 +++++++++++++------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/resources/language/spanish/strings.xml b/resources/language/spanish/strings.xml index 432e5af..620931c 100644 --- a/resources/language/spanish/strings.xml +++ b/resources/language/spanish/strings.xml @@ -1,52 +1,52 @@ Idioma de la interfaz - Fijar estilo visual + Modo vista de carpetas No fijar - Directorio de descarga de archivos (no FAT32) + Carpeta en la que guardar archivos (no FAT32) Utilizar enlaces magnet Almacenaje de archivos descargados Seguir compartiendo archivos descargados - Máx. vel. de subida en mbps (0 = ilimitada) - Máx. vel. de descarga en mbps (0 = ilimitada) + Máx. vel. de subida en Mbit/s (0 = ilimitada) + Máx. vel. de descarga en Mbit/s (0 = ilimitada) Utilizar solo libtorrent Lanzar descarga de episodio siguiente - Descargar metadatos de listas de contenido + Descargar metadatos para listas de contenido Depuración (Modo desarrollador) Confluence (de slng) Transperency (de slng) Confluence (de DiMartino) Confluence (de RussakHH) - Habilitar historial de búsquedas + Habilitar el historial de búsquedas python-libtorrent Ace Stream Reproductor P2P Restablecer ajustes en Add-ons de programas -- AceStream client Duración de las búsquedas - Corta (10 s) + Breve (10 s) Normal (20 s) Larga (30 s) - Descargar antes los subtítulos de todos los directorios - Seguir compartiendo después de reproducir el vídeo + Predescargar los subtítulos de todas las carpetas + Seguir compartiendo después de ver el vídeo Preguntar para cambiar de almacén antes de la descarga - Borrar material en ruso - Restituir material en ruso + Eliminar material ruso + Restituir material ruso Efecto de clic sobre torrent Abrir archivo torrent Abrir menú contextual Descargar vía cliente BitTorrent Descargar vía python-libtorrent - Ordenar resultados por semillas + Ordenar resultados por fuentes Términos para búsqueda personalizada Cifrado Número de hilos de búsqueda - Borrar archivos + Eliminar archivos Guardar archivos Preguntar para guardar Torrent2HTTP (libtorrent vía HTTP) Desbloqueo automático de proxy Ninguno - Anti-zapret (antirestricción) + Anti-zapret (antirrestricción) Inmunidad Núm. máx. de conexiones (0 = ilimitadas) Utilizar puertos aleatorios @@ -57,12 +57,12 @@ Promedio/Buen PC Por debajo de la media, PC/router Tamaño mínimo de almacenaje para autoborrado (GB) - Pausar vídeo tras el inicio + Diferir inicio del reproductor Ordenar resultados de la búsqueda - Por semillas + Por fuentes No ordenar Por nombre - Añadir a historial de vistos después del (%) + Añadir al historial de vistos después del (%) Confluence (de safonov_ivan) Aeon Nox (de joyrider) pyrrent2http (python-libtorrent vía HTTP) @@ -79,12 +79,12 @@ Avanzado Cliente de BitTorrent Hentai (reajustes) - Modo ventana de búsqueda - Habilitar ocultar estilo anterior - Habilitar reponer estilo anterior - Habilitar optativo - Deshabilitar - Fondo transparente de ventana de búsqueda + Modo ventana de búsquedas + Activado ocultar estilo anterior + Activado remplazar estilo anterior + Activado opcional + Desactivado + Fondo transparente de ventana de búsquedas Desactivar notificaciones Ruta para guardar Preguntar @@ -98,14 +98,13 @@ Contraseña Cliente de BitTorrent URL (no SSL) - Sustitución de ruta (solo remoto) + Sustitución de ruta (Solo remoto) Cerrar - Abrir ajustes + Abrir "Ajustes" Navegador de cliente BitTorrent Instalar rastreadores Ajustes de rastreadores Vaciar almacén Seleccionar buscador No hay buscador externo. Instale uno primero. - From 546f2c6cd5d1bd566cfe8258ad405b7b4f78999c Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Tue, 7 Mar 2017 19:29:03 +0100 Subject: [PATCH 122/126] Update Localization.py --- Localization.py | 110 ++++++++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/Localization.py b/Localization.py index 277605e..26b81dc 100644 --- a/Localization.py +++ b/Localization.py @@ -39,7 +39,7 @@ def localize(text): 'Search': 'Buscar', 'Seeds': 'Semillas', 'Peers': 'Pares', - 'Materials are loading now.': 'Los materiales se están descargando', + 'Materials are loading now.': 'Se están cargando los materiales', 'Search Phrase': 'Términos de búsqueda', 'Magnet-link is converting': 'Se está convirtiendo el enlace magnet', 'Error': 'Error', @@ -69,7 +69,7 @@ def localize(text): 'Preloaded: ': 'Carga previa: ', 'Do you want to STOP torrent downloading and seeding?': '¿Desea detener la descarga y dejar de compartir el torrent?', 'Torrent Downloading': 'Descarga de torrent', - 'Auth expired, please relogin': 'Expiró la identificación; vuelva a identificarse', + 'Auth expired, please relogin': 'Expiró la identificación. Vuelva a iniciar sesión', 'Storage': 'Almacén', 'Storage has been cleared': 'El almacén se ha vaciado', 'Clear Storage': 'Vaciar almacén', @@ -85,7 +85,7 @@ def localize(text): 'Ratings': 'Valoraciones', 'Rating': 'Valoración', 'Retry': 'Reintentar', - '%ds has left': '%ds ha dejado', + '%ds has left': 'Ha quedado %ds', 'File failed to play! Do you want to RETRY and buffer more?': 'Falló la reproducción del archivo. ¿Desea volver a intentarlo y aumentar el tamaño de búfer?', 'High Priority Files': 'Archivos de prioridad alta', 'Skip All Files': 'Omitir todos los archivos', @@ -99,50 +99,50 @@ def localize(text): 'Play File': 'Reproducir archivo', 'Start All Files': 'Iniciar todos los archivos', 'Stop All Files': 'Detener todos los archivos', - 'Torrent-client Browser': 'Navegador de cliente de BitTorrent', + 'Torrent-client Browser': 'Explorador de cliente de BitTorrent', 'Remote Torrent-client': 'Cliente de BitTorrent remoto', 'You didn\'t set up replacement path in setting.': 'No se ha establecido una ruta alternativa en "Ajustes".', - 'For example /media/dl_torr/ to smb://SERVER/dl_torr/. Setup now?': 'Por ejemplo, /media/dl_torr/ a smb://SERVER/dl_torr/. ¿Desea ajustarla ahora?', + 'For example /media/dl_torr/ to smb://SERVER/dl_torr/. Setup now?': 'Por ejemplo, /media/dl_torr/ a smb://SERVER/dl_torr/. ¿Desea establecerla ahora?', 'Manual Torrent-client Path Edit': 'Edición manual de la ruta del cliente de BitTorrent', 'Choose .torrent in video library': 'Seleccione archivo .torrent en la colección de vídeos', '.torrent Player': 'Gestor de archivo .torrent', 'Choose directory:': 'Seleccionar directorio:', - 'Starting download next episode!': '¡Iniciando la descarga del capítulo siguiente!', + 'Starting download next episode!': 'Iniciando descarga de episodio siguiente', 'Choose in torrent-client:': 'Elija cliente torrent', - 'Search Control Window': 'Ventana de control de búsquedas', + 'Search Control Window': 'Control de búsquedas', 'Magnet-link (magnet:...)': 'Enlace magnet (magnet:...)', 'Not a magnet-link!': 'No es un enlace magnet', 'Magnet-link Player': 'Gestor de enlace magnet', 'UNKNOWN STATUS': 'ESTADO DESCONOCIDO', - 'Checking preloaded files...': 'Comprobando archivos precargados', + 'Checking preloaded files...': 'Comprobando archivos precargados...', 'Waiting for website response...': 'Esperando respuesta del sitio web...', 'Search and cache information for:': 'Buscar y almacenar datos para:', 'Open Torrent': 'Abrir torrent', - 'Torrent list is empty.': 'La lista de torrent está en blanco', + 'Torrent list is empty.': 'La lista de torrents está en blanco', 'Content Lists': 'Listas de contenido', 'Canceled by User': 'Cancelado por el usuario', 'Do you want to search and cache full metadata + arts?': '¿Desea buscar y almacenar los metadatos y fan-arts completos?', - 'This vastly decreases load speed, but you will be asked to download premade bases!': 'Esto reduce considerablemente la velocidad de carga. Pero se le preguntará si desea descargar desde cero', + 'This vastly decreases load speed, but you will be asked to download premade bases!': 'Esto reduce considerablemente la velocidad de carga. Pero se le solicitará descargar desde cero', 'Do you want to preload full metadata?': '¿Desea precargar los metadatos completos?', - 'It is highly recommended!': '¡Altamente recomendado!', + 'It is highly recommended!': 'Altamente recomendado', 'TV Shows': 'Series de televisión', 'Cartoons': 'Dibujos animados', 'Anime': 'Anime', 'Most Recent': 'Estrenos', 'Top 250 Movies': 'Las 250 mejores películas', 'Top All Time': 'Las mejores de todos los tiempos', - 'by Genre': 'por género', - 'by Year': 'por año', + 'by Genre': 'Por género', + 'by Year': 'Por año', 'Action': 'Acción', 'Adventure': 'Aventuras', 'Animation': 'Animación', 'Biography': 'Biografías', 'Comedy': 'Comedia', - 'Crime': 'Policiaca', + 'Crime': 'Policiacas', 'Documentary': 'Documentales', 'Drama': 'Drama', 'Family': 'Todos los públicos', - 'Fantasy': 'Fantasía', + 'Fantasy': 'Fantásticas', 'Film-Noir': 'Cine negro', 'History': 'Historia', 'Horror': 'Terror', @@ -156,7 +156,7 @@ def localize(text): 'Thriller': 'Suspense', 'War': 'Bélicas', 'Western': 'Películas del Oeste', - '[B]by Site[/B]': '[B]por sitio[/B]', + '[B]by Site[/B]': '[B]Por sitio[/B]', 'Cartoons Series': 'Series de dibujos animados', 'Cartoons Short': 'Cortos de dibujos animados', 'Male': 'Hombre', @@ -168,17 +168,17 @@ def localize(text): 'israeli Movies': 'Películas israelíes', 'hebdub movies': 'Películas dobladas al hebreo', 'Movies': 'Películas', - 'High Resolution Movies': 'Películas en alta resolución', + 'High Resolution Movies': 'Películas en alta resolución', '3D Movies': 'Películas en 3D', - 'Movies [Bluray]': 'Películas en formato Blu-ray', + 'Movies [Bluray]': 'Películas en formato Blu-ray', 'Anime Film': 'Películas Anime', 'Anime Series': 'Series Anime', 'Can\'t download torrent, probably no seeds available.': 'No se puede descargar el torrent, probablemente no hay fuentes disponibles.', 'Personal List': 'Lista personal', 'Add to %s': 'Añadir a %s', 'Delete from %s': 'Eliminar de %s', - 'Added!': '¡Añadido!', - 'Deleted!': '¡Eliminado!', + 'Added!': 'Añadido', + 'Deleted!': 'Eliminado', 'Search History': 'Historial de búsquedas', ' History ':' Historial ', 'Torrent History':'Historial de archivos torrent', @@ -186,7 +186,7 @@ def localize(text): 'Favourites': 'Favoritos', 'Favourites SH': 'Favoritos SH', 'Clear %s': 'Vaciar %s', - 'Clear!': '¡Vacío!', + 'Clear!': 'Vacío', 'kb/s': 'kbps', 'Queued': 'Situado en cola', 'Checking': 'Comprobando', @@ -198,11 +198,11 @@ def localize(text): 'Allocating file & Checking resume': 'Reservando espacio y comprobando reanudación', 'For Kids': 'Para niños', 'Adult': 'Adultos', - 'Does not support magnet links!': '¡No compatible con enlaces magnet!', + 'Does not support magnet links!': 'No compatible con enlaces magnet', 'Reset All Cache DBs': 'Reiniciar todas las bases de datos de la caché', '[B]Search[/B]': '[B]Buscar[/B]', - 'You can always restart this by deleting DBs via Context Menu': 'Siempre se puede reiniciar eliminando las bases de datos a través del menú contextual', - 'Your preloaded databases are outdated!': '¡Las bases de datos precargadas han quedado anticuadas!', + 'You can always restart this by deleting DBs via Context Menu': 'Siempre se puede reiniciar esto eliminando las bases de datos a través del menú contextual', + 'Your preloaded databases are outdated!': 'Las bases de datos precargadas son obsoletas', 'Do you want to download new ones right now?': '¿Desea descargar versiones actualizadas?', 'Individual Tracker Options':'Opciones individuales del rastreador', 'Downloading and copy subtitles. Please wait.':'Descargando y copiando subtítulos. Espere.', @@ -211,10 +211,10 @@ def localize(text): 'Save to path':'Ruta para guardar', 'Return Russian stuff':'Devolver las cosas de Rusia', '%d files have been returned':'Han vuelto %d archivos', - 'Download via T-client':'Descargar a través de cliente de BitTorrent', + 'Download via T-client':'Descargar a través de cliente BitTorrent', 'Download via Libtorrent':'Descargar a través de Libtorrent', 'Download Status':'Estado de la descarga', - 'Download has not finished yet':'La descarga no ha terminado todavía', + 'Download has not finished yet':'La descarga no ha finalizado todavía', 'Stopped and Deleted!':'Detenido y eliminado', 'Unpaused!':'Despausado', 'Paused!':'Pausado', @@ -227,69 +227,69 @@ def localize(text): 'Open':'Abrir', 'Torrent is seeding. To stop it use Download Status.':'El torrent se está compartiendo. Para detenerlo utilice "Estado de la descarga".', 'Start All':'Iniciar todo', - 'Started All!':'¡Se ha iniciado todo!', - 'Stopped All!':'¡Se ha detenido todo!', + 'Started All!':'Se ha iniciado todo', + 'Stopped All!':'Se ha detenido todo', 'Stop All':'Detener todo', 'Keyboard':'Teclado', 'Copy Files in Root':'Copiar archivos en directorio personal de root (/root)', - 'Copied %d files!':'¡Se han copiado %d archivos!', + 'Copied %d files!':'Se han copiado %d archivos', 'Add to MyShows.ru':'Añadir a MyShows.ru', 'Return to MyShows.ru':'Volver a MyShows.ru', 'Search results:':'Resultados de la búsqueda', - 'by Seeders':'por fuentes', - 'by Date':'por fecha', + 'by Seeders':'Por fuentes', + 'by Date':'Por fecha', 'Sort':'Ordenar', 'Close':'Cerrar', 'Views:':'Vistas:', 'Rating:':'Valoración:', - 'Information not found!':'¡No se ha encontrado información!', + 'Information not found!':'No se han encontrado datos', 'Choose searcher':'Elegir buscador', 'python-libtorrent Not Found':'No se ha encontrado python-libtorrent', - 'Windows has static compiled python-libtorrent included.':'Windows cuenta con una versión de python-libtorrent compilada estáticamente', - 'You should install "script.module.libtorrent" from "MyShows.me Kodi Repo"':'Se debe instalar el módulo "script.module.libtorrrent" que se encuentra en el repositorio "MyShows.me"', - 'Linux x64 has not static compiled python-libtorrent included.':'Linux x64 no cuenta con una versión de python-libtorrent compilada estáticamente', + 'Windows has static compiled python-libtorrent included.':'Windows incluye una versión de python-libtorrent compilada estáticamente', + 'You should install "script.module.libtorrent" from "MyShows.me Kodi Repo"':'Se debe instalar "script.module.libtorrrent" desde el repositorio "MyShows.me"', + 'Linux x64 has not static compiled python-libtorrent included.':'Linux x64 no incluye una versión de python-libtorrent compilada estáticamente', 'You should install it by "sudo apt-get install python-libtorrent"':'Se debe instalar con "sudo apt-get install python-libtorrent"', - 'Linux has static compiled python-libtorrent included but it didn\'t work.':'Linux cuenta con una version de python-libtorrent compilada estáticamente, pero no ha funcionado', - 'As far as I know you can compile python-libtorrent for ARMv6-7.':'Por lo que yo sé, se puede compilar para ARMv6-7.', + 'Linux has static compiled python-libtorrent included but it didn\'t work.':'Linux incluye una version de python-libtorrent compilada estáticamente, pero no ha funcionado', + 'As far as I know you can compile python-libtorrent for ARMv6-7.':'Por lo que yo sé, python-libtorrent se puede compilar para ARMv6-7.', 'You should search for "OneEvil\'s OpenELEC libtorrent" or use Ace Stream.':'Se debe buscar "OpenELEC libtorrent de OneEvil" o utilizar Ace Stream', 'Please use install Ace Stream APK and choose it in Settings.':'Instale APK de Ace Stream y selecciónelo en "Ajustes"', - 'It is possible to compile python-libtorrent for Android, but I don\'t know how.':'Es posible compilar python-libtorrent en Android, pero no sé como hacerlo.', + 'It is possible to compile python-libtorrent for Android, but I don\'t know how.':'Es posible compilar python-libtorrent para Android, pero no sé como hacerlo.', 'It is possible to compile python-libtorrent for OS X.':'Es posible compilar python-libtorrent para Mac OS X.', 'But you would have to do it by yourself, there is some info on github.com.':'Pero debe hacerlo por sí mismo. Hay alguna información en github.com.', 'It is NOT possible to compile python-libtorrent for iOS.':'No es posible compilar python-libtorrent para iOS', 'But you can use torrent-client control functions.':'Pero se pueden utilizar las funciones de control del cliente de BitTorrent', - 'I added custom searchers to Torrenter v2!':'¡Se han añadido buscadores personalizados a Torrenter v2!', - 'Now you can use your login on trackers or write and install your own searcher!':'¡Ahora puede identificarse en rastreadores o crear e instalar su propio buscador!', + 'I added custom searchers to Torrenter v2!':'Se han añadido buscadores personalizados a Torrenter v2', + 'Now you can use your login on trackers or write and install your own searcher!':'Ahora puede identificarse en rastreadores o crear e instalar su propio buscador', 'Would you like to install %s from "MyShows.me Kodi Repo" in Programs section?':'¿Le gustaría instalar %s desde el repositorio "MyShows.me", sección Programas?', - 'Open installation window?':'¡Abrir la ventana de instalación?', - 'Android Support':'Compatibilidad con Android', + 'Open installation window?':'¿Abrir ventana de instalación?', + 'Android Support':'Soporte de Android', 'Android has no temprorary folder':'Android no tiene carpeta temporal', - 'Please specify storage folder in Settings!':'Establezca la carpeta de almacenamiento en "Ajustes"', - 'You have no installed or active searchers! More info in Search Control Window!':'¡No se han instalado o activado buscadores! Tiene más información en la ventana Control de búsquedas', + 'Please specify storage folder in Settings!':'Especifique la carpeta de almacenamiento en "Ajustes"', + 'You have no installed or active searchers! More info in Search Control Window!':'No se han instalado o activado buscadores. Tiene más información en Control de búsquedas', 'Please contact DiMartino on kodi.tv forum. We compiled python-libtorrent for Android,':'Póngase en contacto con DiMartino en el foro de kodi.tv. Hemos compilado python-libtorren para Android,', - 'but we need your help with some Torrent is seeding. To stop it use Download Status.s on different processors.':'pero necesitamos su ayuda con algún torrent que se comparta. Para detenerlo utilice Estado de la descarga en diferentes procesadores.', - 'We added Android ARM full support to Torrenter v2!':'¡Hemos añadido compatibilidad completa para Android ARM en Torrenter v2!', - 'I deleted pre-installed ones, install them in Search Control Window!':'Se eliminaron los que estaban preinstalados, ¡instálelos desde la ventana de control de búsquedas!', + 'but we need your help with some Torrent is seeding. To stop it use Download Status.s on different processors.':'pero necesitamos su ayuda con algún torrent que se comparte. Para detenerlo utilice Estado de la descarga. En diferentes procesadores.', + 'We added Android ARM full support to Torrenter v2!':'Hemos añadido compatibilidad completa para Android ARM a Torrenter v2', + 'I deleted pre-installed ones, install them in Search Control Window!':'Se eliminaron los que estaban preinstalados; instálelos desde Control de búsquedas', 'Torrenter didn\'t find %s searcher':'Torrenter no ha encontrado el buscador %s', 'Torrenter Tracker Install':'Instalación de rastreador de Torrenter', 'Ask to save':'Preguntar para guardar', 'Would you like to save this file?':'¿Le gustaría guardar este archivo?', - 'Your storage path is not writable or not local! Please change it in settings!':'La ruta del almacén está protegida contra escritura o no es local. ¡Cámbiela en "Ajustes"!', + 'Your storage path is not writable or not local! Please change it in settings!':'La ruta del almacén está protegida contra escritura o no es local. Cámbiela en "Ajustes"', 'Upgrade advancedsettings.xml':'Actualizar archivo advancedsettings.xml', - 'We would like to set some advanced settings for you!':'¡Nos gustaría efectuar algunos ajustes avanzados por usted!', - 'Do it!':'¡Hacedlo!', + 'We would like to set some advanced settings for you!':'Nos gustaría efectuar algunos ajustes avanzados por usted', + 'Do it!':'Hazlo', 'Please, restart Kodi now!':'Reinicie Kodi', './ (Root folder)':'./ (Carpeta de root)', 'Opening torrent file':'Abriendo archivo torrent', - 'New player to Torrenter v2 - Torrent2HTTP! It should be faster, stable and better with Android, also seeking works in it.':'Nuevo reproductor para Torrenter v2 - Torrent2HTTP: Debe ser más rápido, estable y funcionar mejor en Android así como en los intercambios.', + 'New player to Torrenter v2 - Torrent2HTTP! It should be faster, stable and better with Android, also seeking works in it.':'Nuevo reproductor para Torrenter v2 - Torrent2HTTP. Debe ser más rápido, estable y mejor en Android; además, con él funcionan los intercambios.', 'Would you like to try it?':'¿Le gustaría probarlo?', - 'Torrent2HTTP enabled! Can be changed in Settings.':'¡Se ha activado Torrent2HTTP! Puede cambiarlo en "Ajustes".', + 'Torrent2HTTP enabled! Can be changed in Settings.':'Se ha activado Torrent2HTTP. Puede cambiarse en "Ajustes".', 'Seeking':'Compartiendo', - 'Would you like to resume from %s?':'¿Desea continuar desde %s?', - 'Seeking is working only with player Torrent2HTTP.':'Compartir solo funciona con el reproductor Torrent2HTTP.', + 'Would you like to resume from %s?':'¿Le gustaría reanudar desde %s?', + 'Seeking is working only with player Torrent2HTTP.':'Compartir funciona solamente con el reproductor Torrent2HTTP.', 'Play (from %s)':'Reproducir desde %s', 'Play (from start)':'Reproducir desde el inicio', - }, + }, 'he': { 'Seeds searching.': 'חיפוש זורעים', 'Please Wait': 'המתן', From 18d4f98a52663ff4e8faddb15322b9ba1ccb9f96 Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Tue, 7 Mar 2017 19:49:38 +0100 Subject: [PATCH 123/126] Update addon.xml --- addon.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.xml b/addon.xml index 9f604cb..9de2fff 100644 --- a/addon.xml +++ b/addon.xml @@ -25,7 +25,7 @@ Так же плагин может добавлять, проигрывать и управлять скачками в торрент клиентах (uTorrent, Transmisson, Deluge и Vuse, qBittorrent) или средставми python-libtorrent. GNU GPLv3 http://www.gnu.org/licenses/ - Complemento que nos permite reproducir archivos de vídeo que se comparten en redes BitTorrent, sin necesidad de descargarlos previamente por completo. + Complemento que nos permite ver vídeos que se distribuyen en redes BitTorrent sin necesidad de descargarlos previamente por completo. También gestiona torrents y nos deja elegir entre su propio cliente interno y otros externos (μTorrent, Transmission, Deluge, Vuze, qBittorrent), el cliente BitTorrent con el que realizar las descargas. From 2820abab5134a1dc55ee9638d4fef8aab1d1285a Mon Sep 17 00:00:00 2001 From: patrizia21 Date: Tue, 7 Mar 2017 20:22:42 +0100 Subject: [PATCH 124/126] Update strings.xml --- resources/language/spanish/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/language/spanish/strings.xml b/resources/language/spanish/strings.xml index 620931c..b91427a 100644 --- a/resources/language/spanish/strings.xml +++ b/resources/language/spanish/strings.xml @@ -46,7 +46,7 @@ Torrent2HTTP (libtorrent vía HTTP) Desbloqueo automático de proxy Ninguno - Anti-zapret (antirrestricción) + Anti-zapret (antirestricción) Inmunidad Núm. máx. de conexiones (0 = ilimitadas) Utilizar puertos aleatorios From 2b750b47d21ec374a2be63e696bdd191b48918c1 Mon Sep 17 00:00:00 2001 From: elijahcapricorn Date: Sun, 7 May 2017 20:31:36 +0300 Subject: [PATCH 125/126] Antizapret fails when several threads update the config --- resources/proxy/antizapret.py | 103 +++++++++++++++++----------------- 1 file changed, 52 insertions(+), 51 deletions(-) diff --git a/resources/proxy/antizapret.py b/resources/proxy/antizapret.py index 7da16ea..c2e8758 100644 --- a/resources/proxy/antizapret.py +++ b/resources/proxy/antizapret.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -import os, re, fnmatch, threading, urllib2 +import os, re, fnmatch, threading, urllib2, time, shelve from contextlib import contextmanager, closing from functions import log, debug, tempdir @@ -8,62 +8,62 @@ LOCKS = {} PAC_URL = "http://antizapret.prostovpn.org/proxy.pac" CACHE_DIR = tempdir() USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36" +CONFIG_LOCK = threading.Lock() if not os.path.exists(CACHE_DIR): os.makedirs(CACHE_DIR) -CACHE = 24 * 3600 # 24 hour caching - -#@contextmanager -def shelf(filename, ttl=0): - import shelve - filename = os.path.join(CACHE_DIR, filename) - with LOCKS.get(filename, threading.RLock()): -# with closing(shelve.open(filename, writeback=True)) as d: - d = shelve.open(filename, writeback=True) - #try: - if True: - import time - if not dict(d): - log('xxx') - d.update({ - "created_at": time.time(), - "data": {}, - }) - elif ttl > 0 and (time.time() - d["created_at"]) > ttl: - log('xxx') - d["created_at"] = time.time() - d["data"] = {} - return d - #except: - # d.close() - # raise - -_config = {} +CACHE_LIFETIME = 24 * 3600 # 24 hour caching def config(): - global _config - if not _config: -# with shelf("antizapret.pac_config", ttl=CACHE) as pac_config: - d = shelf("antizapret.pac_config2", ttl=CACHE) - pac_config = d['data'] - if not pac_config: - log("[antizapret]: Fetching Antizapret PAC file on %s" %PAC_URL) - try: - pac_data = urllib2.urlopen(PAC_URL).read() - except: - pac_data = "" + shelf = None + try: + CONFIG_LOCK.acquire() + filename = os.path.join(CACHE_DIR, "antizapret.pac_config2") + shelf = shelve.open(filename) - r = re.search(r"\"PROXY (.*); DIRECT", pac_data) - if r: - pac_config["server"] = r.group(1) - pac_config["domains"] = map(lambda x: x.replace(r"\Z(?ms)", "").replace("\\", ""), map(fnmatch.translate, re.findall(r"\"(.*?)\",", pac_data))) - else: - pac_config["server"] = None - pac_config["domains"] = [] - d.close() - _config = pac_config - return _config + created_at = 0 + data = {} + + if 'created_at' in shelf: + created_at = shelf['created_at'] + + if 'data' in shelf: + data = shelf['data'] + + if((time.time() - created_at) <= CACHE_LIFETIME + and 'domains' in data + and len(data['domains']) > 0): + return data + + log("[antizapret]: Fetching Antizapret PAC file on %s" %PAC_URL) + try: + pac_data = urllib2.urlopen(PAC_URL).read() + except: + pac_data = "" + + r = re.search(r"\"PROXY (.*); DIRECT", pac_data) + if r: + data["server"] = r.group(1) + data["domains"] = map(lambda x: x.replace(r"\Z(?ms)", "").replace("\\", ""), map(fnmatch.translate, re.findall(r"\"(.*?)\",", pac_data))) + else: + data["server"] = None + data["domains"] = [] + + shelf.clear() + shelf.update({ + "created_at": time.time(), + "data": data, + }) + return data + except Exception as ex: + debug("[antizapret]: " + str(ex)) + raise + finally: + if shelf: + shelf.close() + if CONFIG_LOCK.locked(): + CONFIG_LOCK.release() class AntizapretProxyHandler(urllib2.ProxyHandler, object): def __init__(self): @@ -76,7 +76,8 @@ class AntizapretProxyHandler(urllib2.ProxyHandler, object): def proxy_open(self, req, proxy, type): import socket - if socket.gethostbyname(req.get_host().split(":")[0]) in self.config["domains"]: + hostname = req.get_host().split(":")[0] + if socket.gethostbyname(hostname) in self.config["domains"] or hostname in self.config["domains"]: debug("[antizapret]: Pass request through proxy " + self.config["server"]) return urllib2.ProxyHandler.proxy_open(self, req, self.config["server"], type) From f73bcb10a56298d0321d53a03ee160cd91a195f6 Mon Sep 17 00:00:00 2001 From: elijahcapricorn Date: Mon, 8 May 2017 15:13:05 +0300 Subject: [PATCH 126/126] shelve.open fails on corrupted files --- resources/proxy/antizapret.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/resources/proxy/antizapret.py b/resources/proxy/antizapret.py index c2e8758..eee5f43 100644 --- a/resources/proxy/antizapret.py +++ b/resources/proxy/antizapret.py @@ -1,10 +1,9 @@ # -*- coding: utf-8 -*- -import os, re, fnmatch, threading, urllib2, time, shelve +import os, re, fnmatch, threading, urllib2, time, shelve, anydbm from contextlib import contextmanager, closing from functions import log, debug, tempdir -LOCKS = {} PAC_URL = "http://antizapret.prostovpn.org/proxy.pac" CACHE_DIR = tempdir() USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36" @@ -20,7 +19,11 @@ def config(): try: CONFIG_LOCK.acquire() filename = os.path.join(CACHE_DIR, "antizapret.pac_config2") - shelf = shelve.open(filename) + try: + shelf = shelve.open(filename) + except anydbm.error: + os.remove(filename) + shelf = shelve.open(filename) created_at = 0 data = {} @@ -108,5 +111,4 @@ def url_get(url, params={}, headers={}, post = None): return data except urllib2.HTTPError as e: log("[antizapret]: HTTP Error(%s): %s" % (e.errno, e.strerror)) - return None - + return None \ No newline at end of file