Exemple #1
0
        public object Clone()
        {
            CacheEntry entry = new CacheEntry(this.Value, _expirationHint, _evictionHint);

            lock (this)
            {
                if (_grpInfo != null)
                {
                    entry._grpInfo = (GroupInfo)_grpInfo.Clone();
                }
                entry._flags          = (BitSet)_flags.Clone();
                entry.Priority        = this.Priority;
                entry._syncDependency = _syncDependency;
                entry._queryInfo      = _queryInfo;
                if (_keysDependingOnMe != null)
                {
                    entry._keysDependingOnMe = _keysDependingOnMe.Clone() as Hashtable;
                }
                entry._lockId             = _lockId;
                entry._lockDate           = _lockDate;
                entry._size               = _size;
                entry._lockAge            = _lockAge;
                entry._version            = _version;
                entry._creationTime       = _creationTime;
                entry._lastModifiedTime   = _lastModifiedTime;
                entry._lockExpiration     = _lockExpiration;
                entry._resyncProviderName = _resyncProviderName;
                entry._providerName       = _providerName;
                entry._lockManager        = _lockManager;
            }
            return(entry);
        }
        public static GroupInfo CreateOfflineGroupInfo(GroupInfo groupInfo)
        {
            var offlineGroupInfo = groupInfo.Clone();

            offlineGroupInfo.Filter = offlineGroupInfo.Filter + (string.IsNullOrEmpty(offlineGroupInfo.Filter) ? " " : " and ") + "OfflineCount > 0";
            return(offlineGroupInfo);
        }
Exemple #3
0
        public async Task PlayPlaylist(PlaylistSong playlistSong, GroupInfo groupInfo, string playlistId = "")
        {
            LogManager.Shared.LogPlayback(playlistSong);
            SendEndNotification(ScrobbleManager.PlaybackEndedReason.Skipped);
            Settings.CurrentPlaybackContext = new PlaybackContext
            {
                IsContinuous = false,
                Type         = PlaybackContext.PlaybackType.Playlist,
                ParentId     = playlistSong?.PlaylistId ?? playlistId,
            };
            Pause();
            var song = playlistSong == null ? null : Database.Main.GetObject <Song, TempSong>(playlistSong.SongId);
            var info = groupInfo.Clone();
            await Task.WhenAll(
                NativePlayer.PlaySong(song),
                Task.Run(async() =>
            {
                string query =
                    $"select SongId as Id from PlaylistSong {info.FilterString(true)} {info.OrderByString(true)} {info.LimitString()}";
                await SetupCurrentPlaylist(query, song?.Id ?? "", info.Params);
            }));

            if (song == null)
            {
                song = GetSong(CurrentSongIndex);
                await NativePlayer.PlaySong(song);
            }
            await PrepareNextTrack();
        }
Exemple #4
0
        public async Task Play(Song song, GroupInfo groupInfo, bool includeOneStar = false, bool playVideo = false)
        {
            SendEndNotification(ScrobbleManager.PlaybackEndedReason.Skipped);
            Settings.CurrentPlaybackContext = new PlaybackContext
            {
                IsContinuous = false,
                Type         = PlaybackContext.PlaybackType.Song,
            };

            Pause();
            var info = groupInfo.Clone();
            await Task.WhenAll(
                NativePlayer.PlaySong(song),
                Task.Run(async() =>
            {
                if (!includeOneStar)
                {
                    info.Filter += (string.IsNullOrEmpty(info.Filter) ? "" : " and ") + "Rating <> 1";
                }
                string query = $"select Id from Song {info.FilterString(true)} {info.OrderByString(true)} {info.LimitString()}";
                await SetupCurrentPlaylist(query, song?.Id ?? "", info.Params);
            }));

            if (song == null)
            {
                song = GetSong(CurrentSongIndex);
                await NativePlayer.PlaySong(song);
            }
            await PrepareNextTrack();
        }
Exemple #5
0
        public async Task PlayAutoPlaylist(AutoPlaylist playlist, Song playlistSong, GroupInfo groupInfo = null)
        {
            if (groupInfo == null)
            {
                groupInfo = AutoPlaylistSongViewModel.CreateGroupInfo(playlist, Settings.ShowOfflineOnly);
            }
            LogManager.Shared.LogPlayback(playlist);
            SendEndNotification(ScrobbleManager.PlaybackEndedReason.Skipped);
            Settings.CurrentPlaybackContext = new PlaybackContext
            {
                IsContinuous = false,
                Type         = PlaybackContext.PlaybackType.Playlist,
                ParentId     = playlist.Id,
            };
            Pause();
            var song = playlistSong;
            var info = groupInfo.Clone();
            await Task.WhenAll(
                NativePlayer.PlaySong(song),
                Task.Run(async() =>
            {
                string query =
                    $"select Id from Song {info.FilterString(true)} {info.OrderByString(true)} {info.LimitString()}";
                var queryInfo = info.ConvertSqlFromNamed(query);
                await SetupCurrentPlaylist(queryInfo.Item1, song?.Id ?? "", queryInfo.Item2);
            }));

            if (song == null)
            {
                song = GetSong(CurrentSongIndex);
                await NativePlayer.PlaySong(song);
            }
            await PrepareNextTrack();
        }
Exemple #6
0
        public async Task PlayTempPlaylist(PlaylistSong playlistSong, GroupInfo groupInfo, string playlistId = "")
        {
            SendEndNotification(PlaybackEndedReason.Skipped);
            Settings.CurrentPlaybackContext = new PlaybackContext {
                IsContinuous = false,
                Type         = PlaybackContext.PlaybackType.Playlist,
                ParentId     = playlistSong?.PlaylistId ?? playlistId,
            };
            Pause();
            var song = playlistSong == null ? null : Database.Main.GetObject <Song, TempSong> (playlistSong.SongId);
            var info = groupInfo.Clone();
            await Task.WhenAll(
                Player.PlaySong(song),
                Task.Run(async() => {
                string query =
                    $"select SongId as Id from TempPlaylistSong {info.FilterString (true)} {info.OrderByString (true)} {info.LimitString ()}";
                var queryInfo = info.ConvertSqlFromNamed(query);
                await SetupCurrentPlaylist(queryInfo.Item1, song?.Id ?? "", queryInfo.Item2);
            }));

            if (song == null)
            {
                song = GetSong(CurrentSongIndex);
                await Player.PlaySong(song);
            }
            await PrepareNextTrack();
        }
        public static GroupInfo CreateOfflineGroupInfo(GroupInfo groupInfo)
        {
            var offlineGroupInfo = groupInfo.Clone();

            //TODO: Fix this
            offlineGroupInfo.From = "s inner join Song o on o.Id = s.SongId and o.OfflineCount > 0";
            return(offlineGroupInfo);
        }
Exemple #8
0
        protected override IConfigurationItem OnCloning()
        {
            DefaultItemsGroup cloneDefaultItemsGroup = new DefaultItemsGroup();

            foreach (IConfigurationItem configurationItem in ConfigurationItemList)
            {
                cloneDefaultItemsGroup.ConfigurationItemList.Add(configurationItem.Clone() as IConfigurationItem);
            }
            cloneDefaultItemsGroup.GroupInfo = GroupInfo.Clone() as IGroupInfo;
            return(cloneDefaultItemsGroup);
        }
Exemple #9
0
        public override void RowSelected(Genre item)
        {
            //			if (GenreSelected != null) {
            //				GenreSelected (item);
            //				return;
            //			}
            var groupInfo = new GroupInfo()
            {
                Filter  = "Id in (select distinct ArtistId from song where Genre = ?)",
                Params  = item.Id,
                OrderBy = "NameNorm"
            };
            var offlineGroupInfo2 = groupInfo.Clone();

            offlineGroupInfo2.Filter = offlineGroupInfo2.Filter + " and OfflineCount > 0";

            var artistCount =
                Database.Main.GetDistinctObjectCount <Artist>(Settings.ShowOfflineOnly ? offlineGroupInfo2 : groupInfo, "Id");

            if (artistCount == 1)
            {
                groupInfo = new GroupInfo()
                {
                    Filter = "Genre = ?", Params = item.Id
                };
                offlineGroupInfo2        = groupInfo.Clone();
                offlineGroupInfo2.Filter = offlineGroupInfo2.Filter + " and IsLocal = 1";

                var song   = Database.Main.ObjectForRow <Song>(Settings.ShowOfflineOnly ? offlineGroupInfo2 : groupInfo, 0, 0);
                var artist = Database.Main.GetObject <Artist>(song.ArtistId);
                if (artist != null && GoToArtist != null)
                {
                    GoToArtist(artist);
                    return;
                }
            }
            else if (GoToArtistList != null)
            {
                groupInfo = new GroupInfo()
                {
                    From    = "Artist",
                    Filter  = "Id in (select distinct ArtistId from song where genre = ?)",
                    Params  = item.Id,
                    OrderBy = "NameNorm"
                };
                GoToArtistList(item, groupInfo);
            }
            base.RowSelected(item);
        }
Exemple #10
0
        /// <summary>
        /// Creates a new object that is a copy of the current instance and that is routable as well.
        /// </summary>
        /// <returns>A routable copy of this instance.</returns>
        internal CacheEntry RoutableClone(Address localAddress)
        {
            lock (this)
            {
                if (_syncDependency != null || _exh != null)
                {
                    //see if expiration hint itself is non-routable then we only need
                    //a node expiration to handle both the syncDependency and expiration.
                    //otherwise we need a node expiration for syncDependency and also need to
                    //maintain the actual routable expiration hint.

                    NodeExpiration expiry = null;
                    if (localAddress != null)
                    {
                        expiry = new NodeExpiration(localAddress);
                    }

                    if (SyncDependency == null)
                    {
                        if (!_exh.IsRoutable)
                        {
                            CacheEntry e = new CacheEntry(Value, expiry, _evh);
                            if (_grpInfo != null)
                            {
                                e._grpInfo = (GroupInfo)_grpInfo.Clone();
                            }
                            e._bitset           = (BitSet)_bitset.Clone();
                            e._version          = this._version;
                            e._creationTime     = this._creationTime;
                            e._lastModifiedTime = this._lastModifiedTime;

                            if (this.LockMetaInfo != null)
                            {
                                e.LockExpiration = this.LockExpiration;
                            }

                            e._resyncProviderName  = this._resyncProviderName;
                            e.Priority             = Priority;
                            e._itemRemovedListener = _itemRemovedListener;
                            e._itemUpdateListener  = _itemUpdateListener;                            return(e);
                        }
                    }
                    else
                    {
                        if (_exh != null && _exh.IsRoutable)
                        {
                            AggregateExpirationHint aggHint = new AggregateExpirationHint();

                            aggHint.Add(_exh);

                            CacheEntry e = new CacheEntry(Value, aggHint, _evh);
                            if (_grpInfo != null)
                            {
                                e._grpInfo = (GroupInfo)_grpInfo.Clone();
                            }
                            e._bitset           = (BitSet)_bitset.Clone();
                            e._version          = this._version;
                            e._creationTime     = this._creationTime;
                            e._lastModifiedTime = this._lastModifiedTime;

                            if (this.LockMetaInfo != null)
                            {
                                e.LockExpiration = this.LockExpiration;
                            }

                            e._resyncProviderName  = this._resyncProviderName;
                            e.Priority             = Priority;
                            e._itemRemovedListener = _itemRemovedListener;
                            e._itemUpdateListener  = _itemUpdateListener;                            return(e);
                        }
                        else
                        {
                            CacheEntry e = new CacheEntry(Value, expiry, _evh);
                            if (_grpInfo != null)
                            {
                                e._grpInfo = (GroupInfo)_grpInfo.Clone();
                            }
                            e._bitset           = (BitSet)_bitset.Clone();
                            e._version          = this._version;
                            e._creationTime     = this._creationTime;
                            e._lastModifiedTime = this._lastModifiedTime;

                            if (this.LockMetaInfo != null)
                            {
                                e.LockExpiration = this.LockExpiration;
                            }

                            e._resyncProviderName  = this._resyncProviderName;
                            e.Priority             = Priority;
                            e._itemRemovedListener = _itemRemovedListener;
                            e._itemUpdateListener  = _itemUpdateListener;                            return(e);
                        }
                    }
                }
            }
            return((CacheEntry)Clone());
        }
Exemple #11
0
        protected async override void ItemSelected(object item)
        {
            var genre = item as Genre;

            if (genre == null)
            {
                return;
            }

            var groupInfo = new GroupInfo()
            {
                Filter  = "Id in (select distinct ArtistId from song where Genre = @Genre)",
                Params  = { { "@Genre", genre.Id } },
                OrderBy = "NameNorm"
            };
            var offlineGroupInfo2 = groupInfo.Clone();

            offlineGroupInfo2.Filter = offlineGroupInfo2.Filter + " and OfflineCount > 0";

            var artistCount =
                Database.Main.GetDistinctObjectCount <Artist>(Settings.ShowOfflineOnly ? offlineGroupInfo2 : groupInfo, "Id");

            if (artistCount == 1)
            {
                groupInfo = new GroupInfo()
                {
                    Filter = "Genre = @Genre", Params = { { "@Genre", genre.Id } }
                };
                offlineGroupInfo2        = groupInfo.Clone();
                offlineGroupInfo2.Filter = offlineGroupInfo2.Filter + " and IsLocal = 1";

                var song   = Database.Main.ObjectForRow <Song>(Settings.ShowOfflineOnly ? offlineGroupInfo2 : groupInfo, 0, 0);
                var artist = Database.Main.GetObject <Artist>(song.ArtistId);
                if (artist != null)
                {
                    if (artist.AlbumCount > 1)
                    {
                        await this.Navigation.PushAsync(new ArtistDetailsPage(artist));
                    }
                    else
                    {
                        var albumId = (await Database.Main.TablesAsync <Song>().Where(x => x.ArtistId == artist.Id).FirstAsync())?.AlbumId;
                        var album   = Database.Main.GetObject <Album>(albumId);
                        await this.Navigation.PushAsync(new AlbumDetailsPage(album));
                    }
                    return;
                }
            }

            groupInfo = new GroupInfo()
            {
                From    = "Artist",
                Filter  = "Id in (select distinct ArtistId from song where genre = @Genre)",
                Params  = { { "@Genre", genre.Id } },
                OrderBy = "NameNorm"
            };
            await this.Navigation.PushAsync(new ArtistsPage()
            {
                GroupInfo = groupInfo,
                Title     = genre.Name,
            });
        }