Пример #1
0
 private IPlaylistFormat LoadPlaylist(IPlaylistFormat playlist, string filename, Uri rootPath)
 {
     playlist.BaseUri = BaseUri;
     if (rootPath != null)
     {
         playlist.RootPath = rootPath;
     }
     playlist.Load(File.OpenRead(Path.Combine(playlists_dir, filename)), true);
     return(playlist);
 }
Пример #2
0
        public static IPlaylistFormat Load(string playlistUri, Uri baseUri, Uri rootPath)
        {
            PlaylistFormatDescription [] formats = PlaylistFileUtil.ExportFormats;

            // If the file has an extenstion, rearrange the format array so that the
            // appropriate format is tried first.
            if (System.IO.Path.HasExtension(playlistUri))
            {
                string extension = System.IO.Path.GetExtension(playlistUri);
                extension = extension.ToLower();

                int index = -1;
                foreach (PlaylistFormatDescription format in formats)
                {
                    index++;
                    if (extension.Equals("." + format.FileExtension))
                    {
                        break;
                    }
                }

                if (index != -1 && index != 0 && index < formats.Length)
                {
                    // Move to first position in array.
                    PlaylistFormatDescription preferredFormat = formats[index];
                    formats[index] = formats[0];
                    formats[0]     = preferredFormat;
                }
            }

            foreach (PlaylistFormatDescription format in formats)
            {
                try {
                    IPlaylistFormat playlist = (IPlaylistFormat)Activator.CreateInstance(format.Type);
                    playlist.BaseUri  = baseUri;
                    playlist.RootPath = rootPath;
                    playlist.Load(Banshee.IO.File.OpenRead(new SafeUri(playlistUri)), true);
                    return(playlist);
                } catch (InvalidPlaylistException) {
                }
            }

            return(null);
        }
Пример #3
0
        public bool Parse(SafeUri uri)
        {
            ThreadAssist.AssertNotInMainThread();
            lock (this) {
                elements = null;
                HttpWebResponse response       = null;
                Stream          stream         = null;
                Stream          web_stream     = null;
                bool            partial_read   = false;
                long            saved_position = 0;

                if (uri.Scheme == "file")
                {
                    stream = Banshee.IO.File.OpenRead(uri);
                }
                else if (uri.Scheme == "http")
                {
                    response   = Download(uri, HTTP_REQUEST_RETRIES);
                    web_stream = response.GetResponseStream();
                    try {
                        stream = new MemoryStream();

                        byte [] buffer = new byte[4096];
                        int     read;

                        // If we haven't read the whole stream and if
                        // it turns out to be a playlist, we'll read the rest
                        read = web_stream.Read(buffer, 0, buffer.Length);
                        stream.Write(buffer, 0, read);
                        if ((read = web_stream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            partial_read = true;
                            stream.Write(buffer, 0, read);
                            saved_position = stream.Position;
                        }

                        stream.Position = 0;
                    } finally {
                        if (!partial_read)
                        {
                            web_stream.Close();
                            response.Close();
                        }
                    }
                }
                else
                {
                    Hyena.Log.DebugFormat("Not able to parse playlist at {0}", uri);
                    return(false);
                }

                PlaylistFormatDescription matching_format = null;

                foreach (PlaylistFormatDescription format in playlist_formats)
                {
                    stream.Position = 0;

                    if (format.MagicHandler(new StreamReader(stream)))
                    {
                        matching_format = format;
                        break;
                    }
                }

                if (matching_format == null)
                {
                    if (partial_read)
                    {
                        web_stream.Close();
                        response.Close();
                    }
                    return(false);
                }

                if (partial_read)
                {
                    try {
                        stream.Position = saved_position;
                        Banshee.IO.StreamAssist.Save(web_stream, stream, false);
                    } finally {
                        web_stream.Close();
                        response.Close();
                    }
                }
                stream.Position = 0;
                IPlaylistFormat playlist = (IPlaylistFormat)Activator.CreateInstance(matching_format.Type);
                playlist.BaseUri = BaseUri;
                playlist.Load(stream, false);
                stream.Dispose();

                elements = playlist.Elements;
                Title    = playlist.Title ?? Path.GetFileNameWithoutExtension(uri.LocalPath);
                return(true);
            }
        }
Пример #4
0
 private IPlaylistFormat LoadPlaylist (IPlaylistFormat playlist, string filename)
 {
     playlist.BaseUri = BaseUri;
     playlist.Load (File.OpenRead (Path.Combine (playlists_dir, filename)), true);
     return playlist;
 }
Пример #5
0
 private IPlaylistFormat LoadPlaylist (IPlaylistFormat playlist, string filename, Uri rootPath)
 {
     playlist.BaseUri = BaseUri;
     if (rootPath != null) {
         playlist.RootPath = rootPath;
     }
     playlist.Load (File.OpenRead (Path.Combine (playlists_dir, filename)), true);
     return playlist;
 }
Пример #6
0
        public bool Parse(SafeUri uri)
        {
            ThreadAssist.AssertNotInMainThread();
            lock (this) {
                elements = null;
                HttpWebResponse response       = null;
                Stream          stream         = null;
                Stream          web_stream     = null;
                bool            partial_read   = false;
                long            saved_position = 0;

                if (uri.Scheme == "file")
                {
                    stream = Banshee.IO.File.OpenRead(uri);
                }
                else if (uri.Scheme == "http")
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri.AbsoluteUri);
                    request.UserAgent         = Banshee.Web.Browser.UserAgent;
                    request.KeepAlive         = false;
                    request.Timeout           = 5 * 1000;
                    request.AllowAutoRedirect = true;

                    // Parse out and set credentials, if any
                    string user_info = new Uri(uri.AbsoluteUri).UserInfo;
                    if (!String.IsNullOrEmpty(user_info))
                    {
                        string username = String.Empty;
                        string password = String.Empty;
                        int    cIndex   = user_info.IndexOf(":");
                        if (cIndex != -1)
                        {
                            username = user_info.Substring(0, cIndex);
                            password = user_info.Substring(cIndex + 1);
                        }
                        else
                        {
                            username = user_info;
                        }
                        request.Credentials = new NetworkCredential(username, password);
                    }

                    response   = (HttpWebResponse)request.GetResponse();
                    web_stream = response.GetResponseStream();

                    try {
                        stream = new MemoryStream();

                        byte [] buffer = new byte[4096];
                        int     read;

                        // If we haven't read the whole stream and if
                        // it turns out to be a playlist, we'll read the rest
                        read = web_stream.Read(buffer, 0, buffer.Length);
                        stream.Write(buffer, 0, read);
                        if ((read = web_stream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            partial_read = true;
                            stream.Write(buffer, 0, read);
                            saved_position = stream.Position;
                        }

                        stream.Position = 0;
                    } finally {
                        if (!partial_read)
                        {
                            web_stream.Close();
                            response.Close();
                        }
                    }
                }
                else
                {
                    Hyena.Log.DebugFormat("Not able to parse playlist at {0}", uri);
                    return(false);
                }

                PlaylistFormatDescription matching_format = null;

                foreach (PlaylistFormatDescription format in playlist_formats)
                {
                    stream.Position = 0;

                    StreamReader reader = new StreamReader(stream);
                    if (format.MagicHandler(reader))
                    {
                        matching_format = format;
                        break;
                    }
                }

                if (matching_format == null)
                {
                    return(false);
                }

                if (partial_read)
                {
                    try {
                        stream.Position = saved_position;
                        Banshee.IO.StreamAssist.Save(web_stream, stream, false);
                    } finally {
                        web_stream.Close();
                        response.Close();
                    }
                }
                stream.Position = 0;
                IPlaylistFormat playlist = (IPlaylistFormat)Activator.CreateInstance(matching_format.Type);
                playlist.BaseUri = BaseUri;
                playlist.Load(stream, false);
                stream.Dispose();

                elements = playlist.Elements;
                Title    = playlist.Title ?? Path.GetFileNameWithoutExtension(uri.LocalPath);
                return(true);
            }
        }
Пример #7
0
 private IPlaylistFormat LoadPlaylist(IPlaylistFormat playlist, string filename)
 {
     playlist.BaseUri = BaseUri;
     playlist.Load(File.OpenRead(Path.Combine(playlists_dir, filename)), true);
     return(playlist);
 }