-
Notifications
You must be signed in to change notification settings - Fork 275
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Multi thread pour la recherche & ajout de lien direct (utilisable dans Tmdb Helper) #3447
base: Beta
Are you sure you want to change the base?
Conversation
Bonjour @detobel36 Ta modif m'intéresse beaucoup...
J'ai laissé de l'info ici: https://lesalkodiques.com/docs/liste-de-tutos/tmdb-helper/installer-les-players/ et ici: https://lesalkodiques.com/docs/liste-de-tutos/tmdb-helper/les-players/ Mais bon, ce n'était pas accessibles pour tous les utilisateurs tandis que ce que tu proposes par contre l'est! Puisque la modification est fait directement a l'intérieur de vStream. Je vais tester avec grand intérêt ta modification d'ici 1 ou 2 jours 👍 |
j'attendais ton retour @alKODIque car je sais que tu proposes un player tmdbhelper pour lancer un film dans vStream. Tu conclus que ce code est dans vStream et que ce sera donc plus intéressant. J'essaie de voir ce que ce code apporte de plus pour l'utilisation avec tmdbHelper ? Si je suis bien, |
Je n'ai pas testé encore alors il m'est difficile de me prononcer, d'autant plus que je ne m'y connais pas comme vous... j'imagine que le fichier json servant de player pour tmdb helper doit etre modifié puisque GlobalSearch est dépalcer dans un search.py... Mais de ce que j'en comprend: oui!! ce serait vraiment intéressant : dans l'état actuel, tout ce qui se produit avec le palyer vstream.json: c'est qu'il fait seulement un recherche globale... donc si on clique sur un épisode: nous aterrissons sur le dossier de la série. le ''pastebin.json'' que j'avais fait lui, permettait d'aterrir directement sur l'épisode choisie... (mais comme j'expliquais, je l'ai nommé pastebin puisque j'utilise cette source) Meme si présentement ceci est fonctionnel seulement avec les films (Je parle de la solution de @detobel36 ) c'est tout de même avantageux puisque lorsqu'on appui sur ''Play'' depuis TMDb Helper: nous obtenons les liens au lieu d'obtenir des dossiers contenant des liens Je pourrai tester dans 1 jour ou 2 :) |
J'ajoute aussi qu'avec cette possibilité, je crois qu'il sera possible avec un player json, d'appeler ''Play'' mais aussi ''Search''... ce qui n'est pas le cas acxtuellement. ainsi: Bref: vivement que je test hihi |
Merci alkodique, je comprends mieux ce que ça peut apporter par rapport à l'actuel. |
Tant qu'a y être, j'ai une question @detobel36 : A quoi sert le ''priority'' dans le json, et comment la déterminer?? J'ai jamais compris l'utilité puisque je code pas.... Je vois que ton nouveau json indique la ''Priority 101''.... - sur celui que j'ai partagé plus haut, c'est 1000 (et je ne me souviens plus dutout ou et pourquoi j'ai inscris 1000, j'ai tellement fait d'essais-erreurs lol) Ca m'a toujours intrigué! ;) |
Merci pour les retours 😄 Pour bien expliquer la différence avec la solution "précédente": dans ma solution, on "parcours" les sources, puis les films qui correspondent, puis les hosters et enfin on affiche le résultat à l'utilisateur. En gros, ça fait la rechercher et ça permet à l'utilisateur de simplement "cliquer" sur le résultat pour avoir son film. Le fichier ".json" existera quoi qu'il arrive. C'est TmdbHelper qui fonctionne comme ça.
Je pense que ça permet juste de choisir "l'ordre" dans laquelle sera affiché ton "json" dans la liste des choix de TmdbHelper. Donc si par exemple tu as installé "Gaia" et bien en fonction de la priorité, vStream sera avant ou après Gaia. |
Merci... C'est donc probablement un vestige des anciens players qui a la base ont été fait pour ces anciens addons j'imagine :) |
Je viens de voir que ça marche pas trop sur Kodi 18 (dû à Python2). Je verrai pour fix ça. |
Est-ce que ça en vaut vraiment la peine sachant ceci? #3397 |
Moi, personnellement, ça dépend si Kodi 19 est adapté pour Raspberri Pi 3... |
C'est parce que résoudre les hosters de tous les résultats peut être très long. Je suis d'accord que ce genre de résolution complete est interessante pour lancer le film depuis tmdb, mais lors d'une recherche globale, il faut voir les performances (en prenant en compte le multi-thread bien sûr). |
Heu la perso je m'inquiete.
Pareil, en fonction de l heure de la journée, de la date de sortie du film, je suis sur d'etre plus rapide que ton code pour trouver un hoster viable, pendant que lui va tous les interroger. |
@TmpName |
Attention, il ne fait ça que si tu lui donne l'URL que j'ai créé hein 😉 Il ne fait pas ça pour la recherche "normale" 😄 |
@sizanic oui je suis 100% d'accord avec toi, la reponse etait pas pour toi, mais pour @detobel36 ^^ |
ok, a utiliser dans l'url d'un player tmdb. |
Exact. |
Du nouveau par rapport à ça ? |
J'ai laissé plusieurs commentaires de codes qui nécessitent une réponse avant de continuer... |
C'était juste pour savoir si il y avait eu des avancés, vu qu'en ce moment je suis plutôt occupé sur Catchup TV, donc je ne regarde pas trop ce qui se passe ici. |
ba63f8f
to
8a46b89
Compare
@sizanic Heu... Je n'ai pas vu où étaient les questions... Sinon j'ai "rebase" sur la branche Beta. Par contre, je n'ai pas eu l'occasion de tester après mon rebase (il me faut un peu de temps, je n'ai pas de "setup de test" pret). Si quelqu'un à l'occasion 😉 |
@@ -302,7 +302,7 @@ def showLinks(): | |||
oOutputParameterHandler.addParameter('sHost', sHost) | |||
oOutputParameterHandler.addParameter('sLang', sLang) | |||
oOutputParameterHandler.addParameter('sDesc', sDesc) | |||
oGui.addLink(SITE_IDENTIFIER, 'showHosters', sTitle, sThumb, sDesc, oOutputParameterHandler) | |||
oGui.addLink(SITE_IDENTIFIER, 'showHosters', sTitle, sThumb, sDesc, oOutputParameterHandler, oInputParameterHandler) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Il n'est pas utile de passer oInputParameterHandler
en paramètre
car à tous moment, il suffit de faire :
oInputParameterHandler = cInputParameterHandler()
Pour le récupérer 🤔
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
En fait non... Enfin, il me semble que non.
Car les "input" sont récupéré sur base de l'URL. Sauf que l'URL ici ne bouge pas. On appel les méthodes python "à la main". Donc l'URL ne bouge pas, mais les paramètres, eux, changent...
Si ce n'est pas clair, je prendrai le temps d'expliquer avec un exemple concret 😉
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Car les "input" sont récupéré sur base de l'URL. Sauf que l'URL ici ne bouge pas.
Oui, le tout premier url d'appel initial ne bouge pas donc cInputParameterHandler() contient toujours les même paramètres.
On appel les méthodes python "à la main". Donc l'URL ne bouge pas, mais les paramètres, eux, changent...
Le oInputParameterHandler
que tu passes en paramètres d'une méthode à l'autre, contient toujours les paramètres initiaux correspondant à l'URL initiale.
Je ne vois pas comment oInputParameterHandler
pourrait contenir autre chose juste en le passant en paramètre.
Il y a bien des moments où tu reconstruit un oInputParameterHandler
if not oInputParameterHandler:
oInputParameterHandler = cInputParameterHandler()
Mais pour autant, tu ne le valorises pas avec d'autres valeurs de paramètres (et ce n'est pas possible de toute façon). donc il contient les paramètres de l'URL initiale.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Non non, les paramètres sont bien passé d'une méthode à l'autre...
Prenons _4kstreamz.py
:
On appel le showMovies
source
La méthode "retourne" ceci:
oGui.addMovie(SITE_IDENTIFIER, 'showLinks', sDisplayTitle, '', sThumb, sDesc, oOutputParameterHandler)
Le code "détecte" que c'est la méthode showLinks
qui doit être appelé. Donc oOutputParameterHandler
est passé en paramètre de showLinks
:
def showLinks(oInputParameterHandler = False):
showLinks
retourne ceci:
oGui.addLink(SITE_IDENTIFIER, 'showHosters', sDisplayTitle, sThumb, sDesc, oOutputParameterHandler, oInputParameterHandler)
La encore, le code appel showHosters
en lui passant le input:
def showHosters(oInputParameterHandler = False):
Et finalement:
cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb, oInputParameterHandler=oInputParameterHandler)
Et tout ça "marche", car ici dans le gui, je récupère l'input passé en paramètre.
def addLink(self, sId, sFunction, sLabel, sThumbnail, sDesc, oOutputParameterHandler='', oInputParameterHandler = False):
# Pour gérer l'enchainement des épisodes
if not oInputParameterHandler:
oInputParameterHandler = cInputParameterHandler()
Ce qui est également très important à noter, c'est ceci: https://github.com/detobel36/venom-xbmc-addons/blob/tmdbHelperDirectLink/plugin.video.vstream/resources/lib/search.py#L234
Le videoParams = searchResult['params']
(ici) correspond au Outputparameters
Et on fait un:
newSearchResult['params'].mergeUnexistingInfos(videoParams)
Ce qui permet de rajouter les "output" à l'"input" existant...
Et c'est ici qu'on fait le call (donc pour reprendre mon exemple showLinks
, showHosters
, ...) en mettant l'input "à la main".
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pour être encore plus clair, il faudrait que je fasse un "vrai" exemple en exécutant vStream avec un seul hoster et des "print" de débug 😉
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
je vois bien que l'input est passé en paramètre.
Mais pour moi il contient toujours la même chose : les paramètres de l'url.
Je ne trouvais pas à quel moment il pouvait contenir autre chose, et donc l'intérêt de le passer en paramètre.
Mais là tu me dis :
newSearchResult['params'].mergeUnexistingInfos(videoParams)
Ce qui permet de rajouter les "output" à l'"input" existant...
C'est sans doute ce qu'il me manquait pour comprendre, je vais regarder cette partie...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Quelque chose qu'il faut bien comprendre aussi c'est que je n'ai pas renommé toutes les variables, mais quand j'appel "à la main" les requêtes, je ne passe pas l'inputParamter mais bien l'outputParamters reçu par la méthode précédente ;)
Donc l'objet n'est pas un "input" mais bien un "output" (même si python pourrais "penser" que c'est un input).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok, je vois bien maintenant.
si le input n'est pas passé en paramètre, on le récupère comme avant avec un
if not oInputParameterHandler:
oInputParameterHandler = cInputParameterHandler()
Et s'il est passé en paramètre, c'est toi qui l'a mis lors d'un appel implicite, en récupérant l'ancien output (que tu enrichis au besoin) ici : https://github.com/detobel36/venom-xbmc-addons/blob/8a46b897e5ca330f4781bf77a400672502822a82/plugin.video.vstream/resources/lib/search.py#L259
Tout ce que tu as mis en place permet de résoudre exactement la même problématique que j'ai eu pour les appels implicites lorsque je recherche des épisodes suivants d'une série. Avant d'appeler les addSeason et addEpisode, je devais passer des paramètres contextuels.
La solution que j'ai trouvé, était tout simplement de modifier l'url :
Tu noteras que le sParam que j'utilises provient plus haut de :
sParams = oOutputParameterHandler.getParameterAsUri()`
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sauf que tout ça ne marche pas quand tu es dans du multi thread...
La variable sys.argv
est partagée par tous les threads il me semble...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
En effet, ça ne marchera pas en multithread.
self.listRemainingPlugins = [plugin['name'] for plugin in listPlugins] | ||
cGui.resetSearchResult() | ||
return listPlugins | ||
except Exception as error: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
je ne vois pas à quel moment peut arriver une exception.
Donc si un exception peut arriver apres le
self._progressInit()
Et je ne sais plus si ce progressInit
ouvre la progressBar.
Donc je me demande s'il faut mettre un :
self._progressForceClose()
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je ne sais plus pourquoi j'ai mis ce except
...
Je voulais faire en sorte que le code soit assez "robuste". Je pense rajouter self._progressForceClose()
. Mais si ce n'est pas utile, pour moi, ça va de supprimer ce try except
.
def getMediaLink(self): | ||
raise NotImplementedError() | ||
def getMediaLink(self, autoPlay = False): | ||
return self._getMediaLinkForGuest(autoPlay) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Plutot que descendre autoplay en paramètre de _getMediaLinkForGuest
on pourrait le garder et mettre un getter pour ceux qui veulent la valeur :
def getMediaLink(self, autoPlay = False):
self.autoPlay = autoPlay
return self._getMediaLinkForGuest()
Qu'en pense-tu ?
yearScore = self._isYearCorrect(result, searchInfo) | ||
titleScore = self._isMovieTitleCorrect(result, searchInfo) | ||
langScore = self._isLangCorrect(result, searchInfo) | ||
catScore = self._isCategorieCorrect(result, searchInfo) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Lorsqu'on lance une recherche, la catégorie doit être précisée.
Donc il ne devrait pas être nécessaire de vérifier la catégorie en retour car les résultats sont censés correspondre à la catégorie demandée.
Si ce n'est pas le cas, c'est la fonction de recherche de la source qui doit être corrigée, mais pas filtrée ensuite.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Alors, il faut que je vérifie, mais il me semble que certains site ne permettent pas d'avoir la catégorie "directement". Une recharge générale retourne tous les résultats, et puis quand tu "sélectionne" un élément, ça peut changer de catégorie.
ok, je ne dois pas maitriser le système de review 😄 |
Du coup, j'ai fais un fixup... Ici en l'occurence: 89af7e7 Avant de merge, on "rebase" afin d'intégrer directement les fix dans les commits existant 😉 |
Cette pull request est trop grosse. Pour l'instant, j'ai mergé cette partie :
|
89af7e7
to
be67697
Compare
be67697
to
1fc44ca
Compare
J'ai corrigé les conflits mais j'ai pas encore re-testé... Je dois également repasser sur les remarques faites pour être sûr d'avoir fait les modifications 😉 |
1fc44ca
to
ee11a57
Compare
Je test la fonctionnalité depuis quelques jours/semaines et personnellement je n'ai pas eu de gros bug... |
Tu testes le multi-thread de la recherche ou le lien tmdb ? |
Le multi thread est utilisé par le lien tmdb... Pour m'auto paraphraser, je n'ai pas trouvé de bug sur mon code, mais je pense avoir trouvé un bug dans la version déjà présenté sur ce qui a été merge. |
Dans tous les cas, sache qu'on ne t'a pas oublié, on va regarder cela prochainement 👍 |
a1c67ed
to
3e81634
Compare
3e81634
to
fd70aac
Compare
J'ai rebase et les premiers testes montrent que cela fonctionne toujours... Je l'utilise au quotidien, donc je reviens vers vous si je trouve un bug. |
fd70aac
to
4ec49c7
Compare
4ec49c7
to
c4adbe7
Compare
c4adbe7
to
60a6945
Compare
J'ai rebase la PR |
Je suis de nouveau la avec une grosse pull request... Promis c'est la dernière avant un bout de temps 😄
Introduction
Je souhaitais pouvoir lancer directement un film. Je suis donc tombé sur TmdbHelper. Il permet de lancer le player d'une autre extension. Super, c'est ce que je voulais ! Sauf que ce n'est pas directement disponible dans vStream (d'autres addon le font mais vStream est plus complet pour récupérer des films FR).
J'ai donc adapté vStream pour qu'il soit possible de lancer un film depuis TmdbHelper. Voici le fichier que vous devez utilisé (bien évidemment il faut aussi installé le code lié à cette PR 😉 ):
Fichier à mettre dans TmdbHelper
Description
Dans cette pull request j'ai donc:
search.py
playVideo
) ou faire une recherche (quickSearch
).Pour faire cela, j'ai du:
gui.py
sont stocké dans un dictionnaire et non plus dans une listeLimitation
cOutputParameterHandler
.Il faut nuance tout ça hein... A priori vous avez une connexion internet, donc le vStream va quand même finir par traiter les choses "une à une" mais les certaines opérations seront plus rapide.
Bug connu
Gounlimited
), le player va essayer de le lancer, va croire que tout est bon et plantera "plus tard"... La solution: obligatoirement faire une "recherche" pour choisir un autre lien queGounlimited
.La suite
Screen
Paramètre permettant de choisir la langue
Nouveau popup lorsqu'on fait une recherche
Résultat (lorsqu'on clic sur les liens, le film se lance directement (vu que c'est directement la liste des hosters))
Liens
Cette PR peut être en lien avec les issues suivantes:
Mot de la fin