Closed AlphaCentaury closed 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.
Seguimos investigando el origen del problema. De momento, no conseguimos reproducir el error.
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.
Algunos usuarios se están encontrando con un error al intentar ver un canal y lanzar VLC. Se muestra un error similar al siguiente:
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