AlphaCentaury / MovistarTV

IPTViewr: Decodificador virtual IPTV para ver los canales de movistar+ España (imagenio) en Windows con VLC
https://www.alphacentaury.org/movistartv/
Other
50 stars 10 forks source link

Error al intentar ver un canal (System.NullReferenceException) v1.5 beta 1 #18

Closed AlphaCentaury closed 4 years ago

AlphaCentaury commented 4 years ago

Algunos usuarios se están encontrando con un error al intentar ver un canal y lanzar VLC. Se muestra un error similar al siguiente:

Se ha producido un error al procesar su solicitud. Ninguna información ha sido proporcionada en cuanto a dónde ni por qué ocurrio (sic) el error. Los detalles del error se muestran a continuación:

System.NullReferenceException: Referencia a objeto no establecida como instancia de un objeto.

Mientras se resuelve este problema, se puede ver el canal de forma manual siguiendo las instrucciones de este artículo: Ver un canal de forma manual con VLC

AlphaCentaury commented 4 years ago

Consultada la telemetría del programa, se ha encontrado la siguiente información:

ExternalTvPlayer.ShowTvChannel (Form owner, UiBroadcastService service, Boolean defaultPlayer) System.NullReferenceException: Referencia a objeto no establecida como instancia de un objeto.

try
{
    Launch(player, service, !tvPlayerSettings.DirectLaunch);
}
catch (Exception e)
{
    var box = new ExceptionMessageBox()
    {
        Caption = owner.Text,
        Text = string.Format(Texts.ExternalPlayerLaunchError, player.Name, service.DisplayName),
        InnerException = e,
        Beep = true,
        Symbol = ExceptionMessageBoxSymbol.Warning,
        Buttons = ExceptionMessageBoxButtons.OK,
    };

    box.Show(owner);
} // try-catch

El código en la línea 78 intenta inicializar un ExceptionMessageBox para indicar que se ha producido un error durante la llamada a Launch(player, service, !tvPlayerSettings.DirectLaunch);.

Sólo hay un sitio que pueda generar una NullReferenceException, el código para crear el texto del error:

Text = string.Format(Texts.ExternalPlayerLaunchError, player.Name, service.DisplayName),

Lo cual significa que, o bien player es null o bien service. En principio service nunca puede ser null, así que la única opción es que player lo sea.

Pero player tampoco debería ser null ya que siempre existe un reproductor por defecto (VLC) y, en caso de seleccionar un reproductor alternativo, siempre se mostrará en el diálogo de selección el reproductor por defecto.

Así que la única posibilidad es que, de algún modo, se pueda eliminar el reproductor por defecto, por lo que player si podría null, Salvo editando a mano el archivo de configuración, la lista de reproductores se puede modificar mediante el menú IPTViewr > Configuración > Reproductores.

Y se supone que el código en IpTviewr.UiServices.Configuration.Settings.TvPlayers.Editors.TvPlayersSettingsEditor impide que se pueda borrar el reproductor por defecto.

Así que, sobre el papel, este error no debería producirse, pero la realidad es tozuda: existen en la telemetría pruebas de que player puede ser null. Además, puede estar relacionado con otro dos errores que se han detectado en la telemetría:

TvPlayersSettingsEditor.TvPlayersSettingsEditor_Load (Object sender, EventArgs e) C:\Users\Developer\Source\Repos\AlphaCentaury\MovistarTV\1.5 'Kruger 60'\Assemblies\UiServices.Config\Settings\TvPlayers\Editors\TvPlayersSettingsEditor.cs:línea 89 System.NullReferenceException: Referencia a objeto no establecida como instancia de un objeto.

y

TvPlayersSettingsEditor.buttonAdd_Click (Object sender, EventArgs e) C:\Users\Developer\Source\Repos\AlphaCentaury\MovistarTV\1.5 'Kruger 60'\Assemblies\UiServices.Config\Settings\TvPlayers\Editors\TvPlayersSettingsEditor.cs:línea 172 System.NullReferenceException: Referencia a objeto no establecida como instancia de un objeto.

AlphaCentaury commented 4 years ago

Seguimos investigando el origen del problema. De momento, no conseguimos reproducir el error.

AlphaCentaury commented 4 years ago

El problema de las referencias a objeto no establecida System.NullReferenceException está en TvPlayersSettings.GetDefaultPlayer().

La razón por la que se localiza el reproductor por defecto es por un fallo del Asistente de Configuración Inicial FirstTimeConfig.exe al generar el archivo de configuración.

El problema sucede en las siguientes condiciones:

El Asistente trata de forma diferente el reproductor de 64 bits del de 32 bits, ya que losGuid generados son diferentes. El problema es que al grabar el identificador del reproductor por defecto utiliza siempre el de la versión de 64 bits, aunque sea de 32 bits.

<?xml version="1.0" encoding="utf-8"?>
<UserConfiguration>
  <Configuration>
    ...
    <TvPlayers xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://movistartv.alphacentaury.org/schema/2019:Configuration" configurationId="ae75de5d-11a9-4b0f-9efb-242e70c022c9">
      <DefaultPlayerId>364a5b10-6895-438f-8fbe-405e0d816721</DefaultPlayerId>
      <DirectLaunch>false</DirectLaunch>
      <Players>
        <Player name="VLC (32 bits)" id="364a5b10-6895-438f-8fbe-405e0d816721">
          <Path>C:\Program Files (x86)\VideoLAN\VLC\vlc.exe</Path>
          <Arguments>
            <Arg>{param:Channel.Url}</Arg>
            <Arg>:meta-title={param:Channel.Name}</Arg>
          </Arguments>
        </Player>
        <Player name="VLC (en la misma ventana - 32 bits)" id="076d734d-d8f2-4cbb-8aae-b26237d99bcd">
          <Path>C:\Program Files (x86)\VideoLAN\VLC\vlc.exe</Path>
          <Arguments>
            <Arg>{param:Channel.Url}</Arg>
            <Arg>:meta-title={param:Channel.Name}</Arg>
            <Arg>--one-instance</Arg>
            <Arg>--no-playlist-enqueue</Arg>
          </Arguments>
        </Player>
      </Players>
    </TvPlayers>
  </Configuration>
</UserConfiguration>

Aun así, el código que llama a TvPlayersSettings.GetDefaultPlayer() no debe asumir que se localice o que exista un reproductor por defecto.