Commit 9b2dae38 authored by Kellen Sunderland's avatar Kellen Sunderland

Hooked up file selection to super-hack-of-all-time temporary http streamer. ...

Hooked up file selection to super-hack-of-all-time temporary http streamer.  This will serve up files until we can open them directly using appropriate winrt apis.  Also included mvvmlight toolkit for vm locater. Refactored.
parent 843a522c
......@@ -33,4 +33,4 @@ _ReSharper*/
*.orig
*.vspx
*.psess
app/packages
......@@ -83,4 +83,7 @@ Global
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(Performance) = preSolution
HasPerformanceSessions = true
EndGlobalSection
EndGlobal
<Application
x:Class="VLC_WINRT.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mainPage="using:VLC_WINRT.ViewModels.MainPage" xmlns:converters="using:VLC_WINRT.Utility.Converters">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!--
<?xml version="1.0" encoding="utf-8"?>
<Application xmlns:mainPage="using:VLC_WINRT.ViewModels.MainPage" xmlns:converters="using:VLC_WINRT.Utility.Converters" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="VLC_WINRT.App" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:vm="clr-namespace:VLC_WINRT.ViewModel"
xmlns:viewModels="using:VLC_WINRT.ViewModels" mc:Ignorable="d">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!--
Styles that define common aspects of the platform look and feel
Required by Visual Studio project and item templates
-->
<ResourceDictionary Source="Common/StandardStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
<!-- Application-specific resources -->
<!-- Main Page Styles -->
<Style x:Key="ColumnHeaderTextStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="LightGray"></Setter>
<Setter Property="FontSize" Value="30"></Setter>
</Style>
<Style x:Key="ColumnStackPanelStyle" TargetType="StackPanel">
<Setter Property="Margin" Value="0,20,10,0"></Setter>
<Setter Property="MinWidth" Value="300"></Setter>
</Style>
<Style x:Key="ColumnGridStyle" TargetType="Grid">
<Setter Property="Margin" Value="0,20,10,0"></Setter>
<Setter Property="MinWidth" Value="300"></Setter>
</Style>
<x:String x:Key="AppName">VLC_WINRT</x:String>
<!-- View Models -->
<mainPage:MainPageViewModel x:Key="MainViewModel"></mainPage:MainPageViewModel>
<mainPage:ThumbnailsViewModel x:Key="ThumbnailsViewModel"></mainPage:ThumbnailsViewModel>
<!-- Converters -->
<converters:TimespanShortStringConverter x:Key="TimeSpanShortStringConverter"></converters:TimespanShortStringConverter>
<converters:NullToVisibilityConverter x:Key="NullToVisibilityConverter"></converters:NullToVisibilityConverter>
</ResourceDictionary>
</Application.Resources>
</Application>
<ResourceDictionary Source="Common/StandardStyles.xaml" />
</ResourceDictionary.MergedDictionaries>
<!-- Application-specific resources -->
<!-- Main Page Styles -->
<Style p6:Key="ColumnHeaderTextStyle" TargetType="TextBlock" xmlns:p6="http://schemas.microsoft.com/winfx/2006/xaml">
<Setter Property="Foreground" Value="LightGray"></Setter>
<Setter Property="FontSize" Value="30"></Setter>
</Style>
<Style p6:Key="ColumnStackPanelStyle" TargetType="StackPanel" xmlns:p6="http://schemas.microsoft.com/winfx/2006/xaml">
<Setter Property="Margin" Value="0,20,10,0"></Setter>
<Setter Property="MinWidth" Value="300"></Setter>
</Style>
<Style p6:Key="ColumnGridStyle" TargetType="Grid" xmlns:p6="http://schemas.microsoft.com/winfx/2006/xaml">
<Setter Property="Margin" Value="0,20,10,0"></Setter>
<Setter Property="MinWidth" Value="300"></Setter>
</Style>
<String p6:Key="AppName" xmlns:p6="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml">VLC_WINRT</String>
<!-- Converters -->
<converters:TimespanShortStringConverter p6:Key="TimeSpanShortStringConverter" xmlns:p6="http://schemas.microsoft.com/winfx/2006/xaml"></converters:TimespanShortStringConverter>
<converters:NullToVisibilityConverter p6:Key="NullToVisibilityConverter" xmlns:p6="http://schemas.microsoft.com/winfx/2006/xaml"></converters:NullToVisibilityConverter>
<viewModels:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</ResourceDictionary>
</Application.Resources>
</Application>
\ No newline at end of file
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using GalaSoft.MvvmLight;
using Windows.Foundation.Metadata;
namespace VLC_WINRT.Common
......@@ -9,12 +10,12 @@ namespace VLC_WINRT.Common
/// Implementation of <see cref="INotifyPropertyChanged" /> to simplify models.
/// </summary>
[WebHostHidden]
public abstract class BindableBase : INotifyPropertyChanged
public abstract class BindableBase : ViewModelBase, INotifyPropertyChanged
{
/// <summary>
/// Multicast event for property change notifications.
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
public new event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Checks if a property already matches a desired value. Sets the property and
......
......@@ -31,10 +31,11 @@
</Application>
</Applications>
<Capabilities>
<Capability Name="privateNetworkClientServer" />
<Capability Name="removableStorage" />
<Capability Name="videosLibrary" />
<Capability Name="musicLibrary" />
<Capability Name="internetClientServer" />
<Capability Name="internetClient" />
</Capabilities>
</Package>
</Package>
\ No newline at end of file
using System;
using VLC_WINRT.Common;
using VLC_WINRT.ViewModels;
using VLC_WINRT.ViewModels.MainPage;
using VLC_WINRT.Views;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace VLC_WINRT.Utility.Commands
{
public class OpenFileCommand : AlwaysExecutableCommand
{
public override void Execute(object parameter)
{
if (parameter.GetType() != typeof(MediaViewModel) && parameter.GetType() != typeof(ViewedVideoViewModel))
throw new ArgumentException("Expecting to see a Media View Model for this command");
var vm = (MediaViewModel) parameter;
ViewModelLocator.PlayVideoVM.CurrentFile = vm.File;
((Frame) Window.Current.Content).Navigate(typeof (PlayVideo));
ViewModelLocator.PlayVideoVM.VLCPlayer.Play();
}
}
}
\ No newline at end of file
using System;
using System.Diagnostics;
using System.Windows.Input;
using VLC_WINRT.ViewModels;
using VLC_WINRT.Views;
using Windows.Storage;
using Windows.Storage.Pickers;
......@@ -44,8 +45,9 @@ namespace VLC_WINRT.Utility.Commands
if (file != null)
{
Debug.WriteLine("Opening file: " + file.Path);
PlayVideo.CurrentFile = file;
ViewModelLocator.PlayVideoVM.CurrentFile = file;
((Frame) Window.Current.Content).Navigate(typeof (PlayVideo));
ViewModelLocator.PlayVideoVM.VLCPlayer.Play();
}
else
{
......
using System;
using VLC_WINRT.Common;
using VLC_WINRT.ViewModels.MainPage;
using VLC_WINRT.Views;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using System.Windows.Input;
using VLC_WINRT.ViewModels;
namespace VLC_WINRT.Utility.Commands
{
public class PlayCommand : AlwaysExecutableCommand
internal class PlayCommand : ICommand
{
public override void Execute(object parameter)
public bool CanExecute(object parameter)
{
if (parameter.GetType() != typeof(MediaViewModel) && parameter.GetType() != typeof(ViewedVideoViewModel))
throw new ArgumentException("Expecting to see a Media View Model for this command");
return true;
}
var vm = (MediaViewModel) parameter;
PlayVideo.CurrentFile = vm.File;
((Frame) Window.Current.Content).Navigate(typeof (PlayVideo));
public void Execute(object parameter)
{
ViewModelLocator.PlayVideoVM.VLCPlayer.Play();
}
public event EventHandler CanExecuteChanged;
}
}
\ No newline at end of file
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using VLC_WINRT.ViewModels;
using Windows.Foundation;
using Windows.Networking.Sockets;
using Windows.Storage.Streams;
using Buffer = Windows.Storage.Streams.Buffer;
namespace VLC_WINRT.Utility.Services
{
public class HttpListener : IDisposable
{
private string _input = String.Empty;
private StreamSocketListener _listener;
private DataReader _reader;
private DataWriter _writer;
public HttpListener()
{
StartSocket();
}
public void Dispose()
{
CloseWriterAndReader();
}
private void StartSocket()
{
_listener = new StreamSocketListener();
_listener.ConnectionReceived += OnConnection;
try
{
IAsyncAction stuff = _listener.BindServiceNameAsync("8000");
stuff.Completed += BindCompleted;
}
catch (Exception exception)
{
// If this is an unknown status it means that the error is fatal and retry will likely fail.
if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown)
{
throw;
}
Debug.WriteLine("Start listening failed with error: " + exception.Message);
}
}
private void BindCompleted(IAsyncAction asyncinfo, AsyncStatus asyncstatus)
{
Debug.WriteLine(asyncstatus.ToString());
}
private void OnConnection(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
{
try
{
_reader = new DataReader(args.Socket.InputStream);
_writer = new DataWriter(args.Socket.OutputStream);
DataReaderLoadOperation result = _reader.LoadAsync(1);
result.Completed = LoadedAByte;
}
catch (Exception exception)
{
Debug.WriteLine("Hit an exception in tcp reconnection");
}
}
private void CloseWriterAndReader()
{
if (_writer != null)
{
_writer.Dispose();
_writer = null;
}
if (_reader != null)
{
_reader.Dispose();
_reader = null;
}
}
private async void WriteVideoToOutput(ulong start, ulong end)
{
var mediaFile =ViewModelLocator.PlayVideoVM.CurrentFile;
string mimetype = GetMimeType(mediaFile.FileType);
IRandomAccessStreamWithContentType videoFile = await mediaFile.OpenReadAsync();
videoFile.Seek(start);
//construct http header
string header = string.Empty;
header += "HTTP/1.1 206 Partial Content\r\n";
//TODO: Get actual last mime type
header += "Content-Type: "+mimetype+"\r\n";
header += "Accept-Ranges: bytes\r\n";
//TODO: Get actual last modified
header += "Last-Modified: Fri, 16 Sep 2011 04:19:05 GMT\r\n";
header += "Server: KellenD 1.0\r\n";
//TODO: Get actual content length
if (end != 0)
header += "Content-Range: bytes " + start + "-" + end + "/" + videoFile.Size + "\r\n";
else
{
header += "Content-Range: bytes " + start + "-" + (videoFile.Size - start - 1).ToString() + "/" +
videoFile.Size + "\r\n";
}
header += "Content-Length: " + (videoFile.Size - start).ToString() + "\r\n";
header += "Connection: close\r\n";
header += "\r\n";
Debug.WriteLine("Sending header: " + Environment.NewLine);
Debug.WriteLine(header);
_writer.WriteString(header);
ulong bytesSent = start;
ulong chunkSize = 8192;
try
{
while (bytesSent + chunkSize < videoFile.Size)
{
await SendChunk(chunkSize, videoFile);
bytesSent += chunkSize;
}
if (bytesSent < videoFile.Size)
{
await SendChunk(videoFile.Size - bytesSent, videoFile);
}
}
catch (Exception ex)
{
Debug.WriteLine("Output Connection Closed: " + ex);
return;
}
}
private string GetMimeType(string fileType)
{
string mimetype;
switch (fileType)
{
case ".avi":
mimetype = "video/avi";
break;
case ".mp4" :
mimetype = "video/mp4";
break;
case ".m4v" :
mimetype = "video/mp4";
break;
case ".mkv" :
mimetype = "video/x-matroska";
break;
default :
mimetype = "video/mp4";
break;
}
return mimetype;
}
private async Task SendChunk(ulong chunkSize, IRandomAccessStreamWithContentType sr)
{
var buf = new Buffer((uint) chunkSize);
IBuffer result = await sr.ReadAsync(buf, (uint) chunkSize, InputStreamOptions.None);
_writer.WriteBuffer(result);
await _writer.StoreAsync();
await _writer.FlushAsync();
}
private void LoadedAByte(IAsyncOperation<uint> asyncinfo, AsyncStatus asyncstatus)
{
try
{
_input += _reader.ReadString(_reader.UnconsumedBufferLength);
if (_input.Contains("\r\n\r\n"))
{
ulong start = 0, end = 0;
Debug.WriteLine("Call output");
if (_input.ToLower().Contains("range"))
{
GetByteRanges(_input, ref start, ref end);
}
WriteVideoToOutput(start, end);
_input = String.Empty;
}
DataReaderLoadOperation result = _reader.LoadAsync(1);
result.Completed = LoadedAByte; //recurse and read for eva
}
catch (Exception ex)
{
Debug.WriteLine("Input Connection Closed: " + ex);
}
}
private void GetByteRanges(string input, ref ulong start, ref ulong end)
{
string[] headers = input.Split('\n');
foreach (string header in headers)
{
string lh = header.ToLower().Trim();
if (lh.Contains("range"))
{
lh = lh.Replace("range", "");
lh = lh.Replace(":", "");
lh = lh.Replace("bytes", "");
lh = lh.Replace("=", "");
lh = lh.Trim();
string[] ranges = lh.Split('-');
if (ranges.Length != 2)
{
throw new ArgumentOutOfRangeException("Ranges must have 1 or 2 values");
}
ulong.TryParse(ranges[0], out start);
if (!string.IsNullOrEmpty(ranges[1]))
ulong.TryParse(ranges[1], out end);
}
}
}
public void Stop()
{
CloseWriterAndReader();
}
}
}
\ No newline at end of file
......@@ -116,15 +116,17 @@
<Compile Include="Common\KnownVLCLocation.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Common\BindableBase.cs" />
<Compile Include="Utility\Commands\PlayCommand.cs" />
<Compile Include="Utility\Converters\BooleanToVisibilityConverter.cs" />
<Compile Include="Utility\Converters\BooleanNegationConverter.cs" />
<Compile Include="Common\LayoutAwarePage.cs" />
<Compile Include="Common\RichTextColumns.cs" />
<Compile Include="Common\SuspensionManager.cs" />
<Compile Include="Utility\Commands\PickVideoCommand.cs" />
<Compile Include="Utility\Commands\PlayCommand.cs" />
<Compile Include="Utility\Commands\OpenFileCommand.cs" />
<Compile Include="Utility\Converters\NullToVisibilityConverter.cs" />
<Compile Include="Utility\Converters\TimespanShortStringConverter.cs" />
<Compile Include="Utility\Services\HttpListener.cs" />
<Compile Include="Utility\Services\MediaFolderScanner.cs" />
<Compile Include="ViewModels\MainPage\LastViewedViewModel.cs" />
<Compile Include="ViewModels\MainPage\LibraryViewModel.cs" />
......@@ -133,6 +135,8 @@
<Compile Include="ViewModels\MainPage\ThumbnailsViewModel.cs" />
<Compile Include="ViewModels\MainPage\ThumbnailViewModel.cs" />
<Compile Include="ViewModels\MainPage\ViewedVideoViewModel.cs" />
<Compile Include="ViewModels\PlayVideo\PlayVideoViewModel.cs" />
<Compile Include="ViewModels\ViewModelLocator.cs" />
<Compile Include="Views\Addition.xaml.cs">
<DependentUpon>Addition.xaml</DependentUpon>
</Compile>
......@@ -160,6 +164,7 @@
<PRIResource Include="Strings\de-DE\Resources.resw" />
<PRIResource Include="Strings\en-US\Resources.resw" />
<PRIResource Include="Strings\fr-FR\Resources.resw" />
<None Include="packages.config" />
<None Include="VLC_WINRT_TemporaryKey.pfx" />
</ItemGroup>
<ItemGroup>
......@@ -1067,6 +1072,7 @@
<Content Include="Assets\SmallLogo.png" />
<Content Include="Assets\SplashScreen.png" />
<Content Include="Assets\StoreLogo.png" />
<Content Include="MVVMLight.Nuget.Readme.txt" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
......@@ -1107,6 +1113,17 @@
<Name>Microsoft Visual C++ Runtime Package</Name>
</SDKReference>
</ItemGroup>
<ItemGroup>
<Reference Include="GalaSoft.MvvmLight.Extras.Win8">
<HintPath>..\packages\MvvmLight.4.1.26.1\lib\netcore45\GalaSoft.MvvmLight.Extras.Win8.dll</HintPath>
</Reference>
<Reference Include="GalaSoft.MvvmLight.Win8">
<HintPath>..\packages\MvvmLight.4.1.26.1\lib\netcore45\GalaSoft.MvvmLight.Win8.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Practices.ServiceLocation">
<HintPath>..\packages\MvvmLight.4.1.26.1\lib\netcore45\Microsoft.Practices.ServiceLocation.dll</HintPath>
</Reference>
</ItemGroup>
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '11.0' ">
<VisualStudioVersion>11.0</VisualStudioVersion>
</PropertyGroup>
......
......@@ -5,7 +5,7 @@ namespace VLC_WINRT.ViewModels.MainPage
{
public class MediaViewModel : ThumbnailViewModel
{
private PlayCommand _play;
private OpenFileCommand _openFile;
private string _subtitle = string.Empty;
private string _title = string.Empty;
......@@ -14,7 +14,7 @@ namespace VLC_WINRT.ViewModels.MainPage
Title = storageFile.Name;
Subtitle = storageFile.FileType.ToUpper() + " File";
Play = new PlayCommand();
OpenFile = new OpenFileCommand();
}
public string Title
......@@ -29,10 +29,10 @@ namespace VLC_WINRT.ViewModels.MainPage
set { SetProperty(ref _subtitle, value); }
}
public PlayCommand Play
public OpenFileCommand OpenFile
{
get { return _play; }
set { SetProperty(ref _play, value); }
get { return _openFile; }
set { SetProperty(ref _openFile, value); }
}
}
}
\ No newline at end of file
using System;
using VLC_WINRT.Common;
using VLC_WINRT.Utility.Services;
using VLC_Wrapper;
using Windows.Storage;
using Windows.UI.Xaml.Media;
namespace VLC_WINRT.ViewModels.PlayVideo
{
public class PlayVideoViewModel : BindableBase, IDisposable
{
public Player VLCPlayer;
private ImageBrush _brush;
private StorageFile _currentFile;
private HttpListener _listener;
public PlayVideoViewModel()
{
Brush = new ImageBrush();
VLCPlayer = new Player(Brush);
_listener = new HttpListener();
}
public StorageFile CurrentFile
{
get { return _currentFile; }
set
{
SetProperty(ref _currentFile, value);
VLCPlayer.Open("http://localhost:8000/" + _currentFile.Name);
}
}
public ImageBrush Brush
{
get { return _brush; }
set { SetProperty(ref _brush, value); }
}
public void Dispose()
{
if (_listener != null)
{
_listener.Stop();
_listener.Dispose();
_listener = null;
}
}
}
}
\ No newline at end of file
/*
In the View:
DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}"
*/
using GalaSoft.MvvmLight.Ioc;
using Microsoft.Practices.ServiceLocation;
using VLC_WINRT.ViewModels.MainPage;
using VLC_WINRT.ViewModels.PlayVideo;
namespace VLC_WINRT.ViewModels
{
/// <summary>
/// This class contains static references to all the view models in the
/// application and provides an entry point for the bindings.
/// </summary>
public class ViewModelLocator
{
/// <summary>
/// Initializes a new instance of the ViewModelLocator class.
/// </summary>
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
////if (ViewModelBase.IsInDesignModeStatic)
////{
//// // Create design time view services and models
//// SimpleIoc.Default.Register<IDataService, DesignDataService>();
////}
////else
////{
//// // Create run time view services and models
//// SimpleIoc.Default.Register<IDataService, DataService>();
////}
SimpleIoc.Default.Register<PlayVideoViewModel>(true);
SimpleIoc.Default.Register<MainPageViewModel>(true);
SimpleIoc.Default.Register<ThumbnailsViewModel>(true);
}
public static ThumbnailsViewModel ThumbnailsVM
{
get
{
return ServiceLocator.Current.GetInstance<ThumbnailsViewModel>();
}
}
public static PlayVideoViewModel PlayVideoVM
{
get
{
return ServiceLocator.Current.GetInstance<PlayVideoViewModel>();
}
}
public static MainPageViewModel MainPageVM
{
get
{
return ServiceLocator.Current.GetInstance<MainPageViewModel>();
}
}
}
}
\ No newline at end of file
......@@ -8,7 +8,7 @@
d:DesignHeight="300"
d:DesignWidth="400">
<Grid Visibility="{Binding Image, Converter={StaticResource NullToVisibilityConverter}}" >
<Button Command="{Binding Play}"
<Button Command="{Binding OpenFile}"
CommandParameter="{Binding}"
BorderThickness="0"
Padding="4">
......
......@@ -7,7 +7,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="768"
DataContext="{StaticResource ThumbnailsViewModel}"
DataContext="{Binding Source={StaticResource Locator}, Path=ThumbnailsVM}"
>
<!-- TOOD: Do a zoom and clip transform to get rid of any black space -->
<Grid>
......
......@@ -7,7 +7,7 @@
xmlns:mainPage="using:VLC_WINRT.Views.Controls.MainPage"
mc:Ignorable="d"
d:DesignHeight="768"
DataContext="{StaticResource MainViewModel}">
DataContext="{Binding Source={StaticResource Locator}, Path=MainPageVM}">
<Grid Background="Black">
......
......@@ -5,14 +5,15 @@
xmlns:local="using:VLC_WINRT.Views"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
mc:Ignorable="d"
DataContext="{Binding Source={StaticResource Locator}, Path=PlayVideoVM}">
<!--TODO: put in D3D interop here and invoke to libVLC -->
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Background="Black" Tapped="ScreenTapped">
<Rectangle x:Name="VideoSurface"></Rectangle>
<Grid Grid.Row="0" Background="{Binding Brush}" Tapped="ScreenTapped">
</Grid>
</Grid>
<Page.TopAppBar>
......
using System;
using VLC_Wrapper;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
......@@ -15,12 +12,8 @@ namespace VLC_WINRT.Views
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class PlayVideo : Page, IDisposable