public ISpotifySession Create()
        {
            var config = new SpotifySessionConfig
            {
                ApiVersion = ApiVersion,
                ApplicationKey = ApplicationKey,
                CacheLocation = "Temp",
                SettingsLocation = "Temp",
                UserAgent = "HeadlessPlayer",
                Listener = new SpotifySessionListenerToEventAdapter(_bus, _soundOutput, _spotifyLogProcessor)
            };

            return SpotifySession.Create(config);
        }
Esempio n. 2
0
        /// <summary>
        /// Create a SpotifySession, as per sp_session_create.
        /// </summary>
        /// <param name="config"></param>
        /// <returns>
        /// The SpotifySession. The caller is responsible for calling Dispose on
        /// the session.
        /// </returns>
        public static SpotifySession Create(SpotifySessionConfig config)
        {
            IntPtr sessionPtr = IntPtr.Zero;
            IntPtr listenerToken;

            using (var cacheLocation = SpotifyMarshalling.StringToUtf8(config.CacheLocation))
                using (var settingsLocation = SpotifyMarshalling.StringToUtf8(config.SettingsLocation))
                    using (var userAgent = SpotifyMarshalling.StringToUtf8(config.UserAgent))
                        using (var deviceId = SpotifyMarshalling.StringToUtf8(config.DeviceId))
                            using (var proxy = SpotifyMarshalling.StringToUtf8(config.Proxy))
                                using (var proxyUsername = SpotifyMarshalling.StringToUtf8(config.ProxyUsername))
                                    using (var proxyPassword = SpotifyMarshalling.StringToUtf8(config.ProxyPassword))
#if SYSTEM_LINUX
                                        // The field is Linux-only.
                                        using (var caCertsFilename = SpotifyMarshalling.StringToUtf8(config.CACertsFilename))
#endif
                                        using (var traceFile = SpotifyMarshalling.StringToUtf8(config.TraceFile))
                                        {
                                            IntPtr appKeyPtr = IntPtr.Zero;
                                            listenerToken = ListenerTable.PutUniqueObject(config.Listener, config.UserData);
                                            try
                                            {
                                                NativeCallbackAllocation.AddRef();
                                                byte[] appkey = config.ApplicationKey;
                                                appKeyPtr = Marshal.AllocHGlobal(appkey.Length);
                                                Marshal.Copy(config.ApplicationKey, 0, appKeyPtr, appkey.Length);
                                                sp_session_config nativeConfig = new sp_session_config {
                                                    api_version                      = config.ApiVersion,
                                                    cache_location                   = cacheLocation.IntPtr,
                                                    settings_location                = settingsLocation.IntPtr,
                                                    application_key                  = appKeyPtr,
                                                    application_key_size             = (UIntPtr)appkey.Length,
                                                    user_agent                       = userAgent.IntPtr,
                                                    callbacks                        = SessionDelegates.CallbacksPtr,
                                                    userdata                         = listenerToken,
                                                    compress_playlists               = config.CompressPlaylists,
                                                    dont_save_metadata_for_playlists = config.DontSaveMetadataForPlaylists,
                                                    initially_unload_playlists       = config.InitiallyUnloadPlaylists,
                                                    device_id                        = deviceId.IntPtr,
                                                    proxy          = proxy.IntPtr,
                                                    proxy_username = proxyUsername.IntPtr,
                                                    proxy_password = proxyPassword.IntPtr,
#if SYSTEM_LINUX
                                                    // The ca_certs_filename field is Linux-only.
                                                    ca_certs_filename = caCertsFilename.IntPtr,
#endif
                                                    tracefile = traceFile.IntPtr,
                                                };
                                                // Note: sp_session_create will invoke a callback, so it's important that
                                                // we have already done ListenerTable.PutUniqueObject before this point.
                                                var error = NativeMethods.sp_session_create(ref nativeConfig, ref sessionPtr);
                                                SpotifyMarshalling.CheckError(error);
                                            }
                                            catch
                                            {
                                                ListenerTable.ReleaseObject(listenerToken);
                                                NativeCallbackAllocation.ReleaseRef();
                                                throw;
                                            }
                                            finally
                                            {
                                                if (appKeyPtr != IntPtr.Zero)
                                                {
                                                    Marshal.FreeHGlobal(appKeyPtr);
                                                }
                                            }
                                        }

            SpotifySession session = SessionTable.GetUniqueObject(sessionPtr);

            session.Listener      = config.Listener;
            session.UserData      = config.UserData;
            session.ListenerToken = listenerToken;
            return(session);
        }
Esempio n. 3
0
        public SpotifyDownloader()
        {
            if (!Directory.Exists(tmpPath))
                Directory.CreateDirectory(tmpPath);

            if (!Directory.Exists(downloadPath))
                Directory.CreateDirectory(downloadPath);

            var config = new SpotifySessionConfig()
            {
                ApiVersion = 12,
                CacheLocation = tmpPath,
                SettingsLocation = tmpPath,
                ApplicationKey = File.ReadAllBytes("spotify_appkey.key"),
                UserAgent = "downtify",
                Listener = this
            };

            syncContext = SynchronizationContext.Current;
            session = SpotifySession.Create(config);
            Task.Factory.StartNew(() => InvokeProcessEvents());
        }
Esempio n. 4
0
        /// <summary>
        /// Create a SpotifySession, as per sp_session_create.
        /// </summary>
        /// <param name="config"></param>
        /// <returns>
        /// The SpotifySession. The caller is responsible for calling Dispose on
        /// the session.
        /// </returns>
        public static SpotifySession Create(SpotifySessionConfig config)
        {
            IntPtr sessionPtr = IntPtr.Zero;
            IntPtr listenerToken;
            using (var cacheLocation = SpotifyMarshalling.StringToUtf8(config.CacheLocation))
            using (var settingsLocation = SpotifyMarshalling.StringToUtf8(config.SettingsLocation))
            using (var userAgent = SpotifyMarshalling.StringToUtf8(config.UserAgent))
            using (var deviceId = SpotifyMarshalling.StringToUtf8(config.DeviceId))
            using (var proxy = SpotifyMarshalling.StringToUtf8(config.Proxy))
            using (var proxyUsername = SpotifyMarshalling.StringToUtf8(config.ProxyUsername))
            using (var proxyPassword = SpotifyMarshalling.StringToUtf8(config.ProxyPassword))
            #if SYSTEM_LINUX
            // The field is Linux-only.
            using (var caCertsFilename = SpotifyMarshalling.StringToUtf8(config.CACertsFilename))
            #endif
            using (var traceFile = SpotifyMarshalling.StringToUtf8(config.TraceFile))
            {
                IntPtr appKeyPtr = IntPtr.Zero;
                listenerToken = ListenerTable.PutUniqueObject(config.Listener, config.UserData);
                try
                {
                    NativeCallbackAllocation.AddRef();
                    byte[] appkey = config.ApplicationKey;
                    appKeyPtr = Marshal.AllocHGlobal(appkey.Length);
                    Marshal.Copy(config.ApplicationKey, 0, appKeyPtr, appkey.Length);
                    sp_session_config nativeConfig = new sp_session_config {
                        api_version = config.ApiVersion,
                        cache_location = cacheLocation.IntPtr,
                        settings_location = settingsLocation.IntPtr,
                        application_key = appKeyPtr,
                        application_key_size = (UIntPtr)appkey.Length,
                        user_agent = userAgent.IntPtr,
                        callbacks = SessionDelegates.CallbacksPtr,
                        userdata = listenerToken,
                        compress_playlists = config.CompressPlaylists,
                        dont_save_metadata_for_playlists = config.DontSaveMetadataForPlaylists,
                        initially_unload_playlists = config.InitiallyUnloadPlaylists,
                        device_id = deviceId.IntPtr,
                        proxy = proxy.IntPtr,
                        proxy_username = proxyUsername.IntPtr,
                        proxy_password = proxyPassword.IntPtr,
            #if SYSTEM_LINUX
                        // The ca_certs_filename field is Linux-only.
                        ca_certs_filename = caCertsFilename.IntPtr,
            #endif
                        tracefile = traceFile.IntPtr,
                    };
                    // Note: sp_session_create will invoke a callback, so it's important that
                    // we have already done ListenerTable.PutUniqueObject before this point.
                    var error = NativeMethods.sp_session_create(ref nativeConfig, ref sessionPtr);
                    SpotifyMarshalling.CheckError(error);
                }
                catch
                {
                    ListenerTable.ReleaseObject(listenerToken);
                    NativeCallbackAllocation.ReleaseRef();
                    throw;
                }
                finally
                {
                    if (appKeyPtr != IntPtr.Zero)
                    {
                        Marshal.FreeHGlobal(appKeyPtr);
                    }
                }
            }

            SpotifySession session = SessionTable.GetUniqueObject(sessionPtr);
            session.Listener = config.Listener;
            session.UserData = config.UserData;
            session.ListenerToken = listenerToken;
            return session;
        }
Esempio n. 5
0
        public SpShell(AutoResetEvent aSpotifyEvent, string aUsername, string aPassword, string aBlob, bool aSelftest, ConsoleReader aReader, byte[] aAppKey)
        {
            iReader = aReader;
            iSpotifyEvent = aSpotifyEvent;
            SpotifySessionConfig config = new SpotifySessionConfig();
            config.ApiVersion = 12;
            config.CacheLocation = aSelftest ? "" : "tmp";
            config.SettingsLocation = aSelftest ? "" : "tmp";
            config.ApplicationKey = aAppKey;
            config.UserAgent = "spshell#";
            config.Listener = this;

            try
            {
                iSession = SpotifySession.Create(config);
            }
            catch (SpotifyException e)
            {
                Console.Error.WriteLine("Failed to create session: {0}", e.Message);
                throw;
            }

            iBrowser = new Browser(iSession, this, aReader);
            iSearcher = new Searcher(iSession, aReader);
            iTopLister = new TopLister(iSession, aReader);
            iMessaging = new Messaging(iSession, aReader, iBrowser);
            iStarManager = new StarManager(iSession, aReader, iBrowser);
            iPlaylistManager = new PlaylistManager(iSession, aReader, iBrowser);

            iCommands = new ConsoleCommandDictionary(CmdDone)
                        {
                            { "log",      CmdLog,                  "Enable/Disable logging to console (default off)" },
                            { "logout",   CmdLogout,               "Logout and exit app" },
                            { "exit",     CmdLogout,               "Logout and exit app" },
                            { "quit",     CmdLogout,               "Logout and exit app" },
                            { "browse",   iBrowser.CmdBrowse,      "Browse a Spotify URL" },
                            { "search",   iSearcher.CmdSearch,     "Search" },
                            { "whatsnew", iSearcher.CmdWhatsNew,   "List new albums" },
                            { "toplist",  iTopLister.CmdTopList,   "Browse toplists" },
                            { "post",     iMessaging.CmdPost,      "Post track to a user's inbox" },
                            { "inbox",    iMessaging.CmdInbox,     "View inbox" },
                            { "star",     iStarManager.CmdStar,    "Star a track" },
                            { "unstar",   iStarManager.CmdUnstar,  "Unstar a track" },
                            { "starred",  iStarManager.CmdStarred, "List all starred tracks" },
                            { "playlists",            iPlaylistManager.CmdPlaylists,           "List playlists" },
                            { "playlist",             iPlaylistManager.CmdPlaylist,            "List playlist contents" },
                            { "set_autolink",         iPlaylistManager.CmdSetAutolink,         "Set autolinking state" },
                            { "add_folder",           iPlaylistManager.CmdAddFolder,           "Add playlist folder" },
                            { "update_subscriptions", iPlaylistManager.CmdUpdateSubscriptions, "Update playlist subscription info" },
                            { "add",                  iPlaylistManager.CmdAddTrack,            "Add track to playlist" },
                            { "offline",              iPlaylistManager.CmdPlaylistOffline,     "Set offline mode for a playlist" },
                        };
            iCommands.Add("help", iCommands.CmdHelp, "This help");

            try
            {
                if (aUsername == null)
                {
                    iSession.Relogin();
                    var reloginname = iSession.RememberedUser();
                    Console.Error.WriteLine("Trying to relogin as user {0}", reloginname);
                }
                else
                {
                    iSession.Login(aUsername, aPassword, true, aBlob);
                }
            }
            catch (SpotifyException e)
            {
                if (e.Error == SpotifyError.NoCredentials)
                {
                    Console.Error.WriteLine("No stored credentials");
                    throw;
                }
            }
        }
Esempio n. 6
0
        public SpotifyDownloader()
        {
            tmpPath = Downtify.GUI.frmMain.configuration.GetConfiguration("cache", "cache/");
            downloadPath = Downtify.GUI.frmMain.configuration.GetConfiguration("download", "download/");

            if (!Directory.Exists(tmpPath))
                Directory.CreateDirectory(tmpPath);

            if (!Directory.Exists(downloadPath))
                Directory.CreateDirectory(downloadPath);

            var config = new SpotifySessionConfig()
            {
                ApiVersion = 12,
                CacheLocation = tmpPath,
                SettingsLocation = tmpPath,
                ApplicationKey = File.ReadAllBytes("spotify_appkey.key"),
                UserAgent = "downtify",
                Listener = this
            };

            syncContext = SynchronizationContext.Current;
            session = SpotifySession.Create(config);
        }