コード例 #1
0
ファイル: AppleDeviceSource.cs プロジェクト: shaw1337/banshee
        private void LoadFromDevice(bool refresh)
        {
            tracks_map.Clear();
            if (refresh || MediaDatabase == null)
            {
                if (MediaDatabase != null)
                {
                    MediaDatabase.Dispose();
                }

                try {
                    MediaDatabase = new GPod.ITDB(Device.Mountpoint);
                } catch (GLib.GException e) {
                    Log.Exception("iPod database could not be loaded, creating a new one", e);
                    if (GPod.ITDB.InitIpod(Volume.MountPoint, null, Volume.Name))
                    {
                        // this may throw again. In the future we need to implement some kind of alert
                        // mechanism to let the user know that something more serious is wrong with their
                        // apple device a la the other iPod extension.
                        MediaDatabase = new GPod.ITDB(Device.Mountpoint);
                    }
                    else
                    {
                        Log.Error("Failed to init iPod database");
                        return;
                    }
                }
            }

            if (MediaDatabase.MasterPlaylist == null)
            {
                MediaDatabase.Playlists.Add(new GPod.Playlist(Name)
                {
                    IsMaster = true
                });
            }

            if (SupportsPodcasts && MediaDatabase.PodcastsPlaylist == null)
            {
                MediaDatabase.Playlists.Add(new GPod.Playlist(Catalog.GetString("Podcasts"))
                {
                    IsPodcast = true
                });
            }

            var invalid_tracks = new List <GPod.Track> ();

            foreach (var ipod_track in MediaDatabase.Tracks)
            {
                if (String.IsNullOrEmpty(ipod_track.IpodPath))
                {
                    invalid_tracks.Add(ipod_track);
                    continue;
                }

                try {
                    var track = new AppleDeviceTrackInfo(ipod_track);
                    if (!tracks_map.ContainsKey(track.TrackId))
                    {
                        track.PrimarySource = this;
                        track.Save(false);
                        tracks_map.Add(track.TrackId, track);
                    }
                } catch (Exception e) {
                    Log.Exception(e);
                }
            }
            if (invalid_tracks.Count > 0)
            {
                Log.Warning(String.Format("Found {0} invalid tracks on the device", invalid_tracks.Count));
                foreach (var track in invalid_tracks)
                {
                    DeleteTrack(track, false);
                }
            }


            Hyena.Data.Sqlite.HyenaSqliteCommand insert_cmd = new Hyena.Data.Sqlite.HyenaSqliteCommand(
                @"INSERT INTO CorePlaylistEntries (PlaylistID, TrackID)
                    SELECT ?, TrackID FROM CoreTracks WHERE PrimarySourceID = ? AND ExternalID = ?");
            foreach (var playlist in MediaDatabase.Playlists)
            {
                if (playlist.IsMaster || playlist.IsPodcast)
                {
                    continue;
                }

                PlaylistSource pl_src = new PlaylistSource(playlist.Name, this);
                pl_src.Save();
                // We use the GPod.Track.DBID here b/c we just shoved it into ExternalID above when we loaded
                // the tracks, however when we sync, the Track.DBID values may/will change.
                foreach (var track in playlist.Tracks)
                {
                    // DBID will be stored in a long, so we need to cast it. See bgo#650011
                    ServiceManager.DbConnection.Execute(insert_cmd, pl_src.DbId, this.DbId, (long)track.DBID);
                }
                pl_src.UpdateCounts();
                AddChildSource(pl_src);
            }

            RaiseReadyToScrobble();
        }
コード例 #2
0
        private void LoadFromDevice (bool refresh)
        {
            tracks_map.Clear ();
            if (refresh || MediaDatabase  == null) {
                if (MediaDatabase != null)
                    MediaDatabase.Dispose ();

                try {
                    MediaDatabase = new GPod.ITDB (Device.Mountpoint);
                } catch (GLib.GException e) {
                    Log.Exception ("iPod database could be loaded, creating a new one", e);
                    if (GPod.ITDB.InitIpod (Volume.MountPoint, null, Volume.Name)) {
                        // this may throw again. In the future we need to implement some kind of alert
                        // mechanism to let the user know that something more serious is wrong with their
                        // apple device a la the other iPod extension.
                        MediaDatabase = new GPod.ITDB (Device.Mountpoint);
                    } else {
                        Log.Error ("Failed to init iPod database");
                        return;
                    }
                }
            }

            if (MediaDatabase.MasterPlaylist == null) {
                MediaDatabase.Playlists.Add (new GPod.Playlist (Name) {
                    IsMaster = true
                });
            }

            if (SupportsPodcasts && MediaDatabase.PodcastsPlaylist == null) {
                MediaDatabase.Playlists.Add (new GPod.Playlist (Catalog.GetString ("Podcasts")) {
                    IsPodcast = true
                });
            }

            foreach (var ipod_track in MediaDatabase.Tracks) {
                try {
                    var track = new AppleDeviceTrackInfo (ipod_track);
                    if (!tracks_map.ContainsKey (track.TrackId)) {
                        track.PrimarySource = this;
                        track.Save (false);
                        tracks_map.Add (track.TrackId, track);
                    }
                } catch (Exception e) {
                    Log.Exception (e);
                }
            }

            Hyena.Data.Sqlite.HyenaSqliteCommand insert_cmd = new Hyena.Data.Sqlite.HyenaSqliteCommand (
                @"INSERT INTO CorePlaylistEntries (PlaylistID, TrackID)
                    SELECT ?, TrackID FROM CoreTracks WHERE PrimarySourceID = ? AND ExternalID = ?");
            foreach (var playlist in MediaDatabase.Playlists) {
                if (playlist.IsMaster || playlist.IsPodcast)
                    continue;

                PlaylistSource pl_src = new PlaylistSource (playlist.Name, this);
                pl_src.Save ();
                // We use the IPod.Track.Id here b/c we just shoved it into ExternalID above when we loaded
                // the tracks, however when we sync, the Track.Id values may/will change.
                foreach (var track in playlist.Tracks) {
                    ServiceManager.DbConnection.Execute (insert_cmd, pl_src.DbId, this.DbId, track.DBID);
                }
                pl_src.UpdateCounts ();
                AddChildSource (pl_src);
            }
        }
コード例 #3
0
        private void LoadFromDevice (bool refresh)
        {
            tracks_map.Clear ();
            if (refresh || MediaDatabase  == null) {
                if (MediaDatabase != null)
                    MediaDatabase.Dispose ();

                MediaDatabase = new GPod.ITDB (Device.Mountpoint);
            }

            foreach (var ipod_track in MediaDatabase.Tracks) {
                try {
                    var track = new AppleDeviceTrackInfo (ipod_track);
                    if (!tracks_map.ContainsKey (track.TrackId)) {
                        track.PrimarySource = this;
                        track.Save (false);
                        tracks_map.Add (track.TrackId, track);
                    }
                } catch (Exception e) {
                    Log.Exception (e);
                }
            }

//                Hyena.Data.Sqlite.HyenaSqliteCommand insert_cmd = new Hyena.Data.Sqlite.HyenaSqliteCommand (
//                    @"INSERT INTO CorePlaylistEntries (PlaylistID, TrackID)
//                        SELECT ?, TrackID FROM CoreTracks WHERE PrimarySourceID = ? AND ExternalID = ?");
//                foreach (IPod.Playlist playlist in ipod_device.TrackDatabase.Playlists) {
//                    if (playlist.IsOnTheGo) { // || playlist.IsPodcast) {
//                        continue;
//                    }
//                    PlaylistSource pl_src = new PlaylistSource (playlist.Name, this);
//                    pl_src.Save ();
//                    // We use the IPod.Track.Id here b/c we just shoved it into ExternalID above when we loaded
//                    // the tracks, however when we sync, the Track.Id values may/will change.
//                    foreach (IPod.Track track in playlist.Tracks) {
//                        ServiceManager.DbConnection.Execute (insert_cmd, pl_src.DbId, this.DbId, track.Id);
//                    }
//                    pl_src.UpdateCounts ();
//                    AddChildSource (pl_src);
//                }
            /*else {
                BuildDatabaseUnsupportedWidget ();
            }*/

            /*if(previous_database_supported != database_supported) {
                OnPropertiesChanged();
            }*/
        }
コード例 #4
0
        public void CommitToIpod(GPod.ITDB database)
        {
            bool addTrack = IpodTrack == null;

            if (IpodTrack == null)
            {
                IpodTrack = new GPod.Track();
            }

            var track = IpodTrack;

            track.Compilation = IsCompilation;
            track.AlbumArtist = AlbumArtist;
            track.Bitrate     = BitRate;
            track.Samplerate  = (ushort)SampleRate;
            track.BPM         = (short)Bpm;
            track.Comment     = Comment;
            track.Composer    = Composer;
            track.TimeAdded   = DateTime.Now;
            track.CDs         = DiscCount;
            track.CDNumber    = DiscNumber;
            track.TrackLength = (int)Duration.TotalMilliseconds;
            track.Size        = (int)FileSize;
            track.Grouping    = Grouping;
            try {
                track.TimePlayed = LastPlayed;
            } catch {
                Hyena.Log.InformationFormat("Couldn't set TimePlayed to '{0}'", LastPlayed);
            }
            track.PlayCount   = (uint)PlayCount;
            track.Tracks      = TrackCount;
            track.TrackNumber = TrackNumber;
            track.Year        = Year;
            try {
                track.TimeReleased = ReleaseDate;
            } catch {
                Hyena.Log.InformationFormat("Couldn't set TimeReleased to '{0}'", ReleaseDate);
            }
            track.Album  = AlbumTitle;
            track.Artist = ArtistName;
            track.Title  = TrackTitle;
            track.Genre  = Genre;

            track.SortArtist      = ArtistNameSort;
            track.SortAlbum       = AlbumTitleSort;
            track.SortAlbumArtist = AlbumArtistSort;
            track.SortTitle       = TrackTitleSort;

            track.Rating = ((Rating >= 1) && (Rating <= 5)) ? (uint)Rating : 0;

            if (HasAttribute(TrackMediaAttributes.Podcast))
            {
                track.Description = description;
                track.RememberPlaybackPosition = true;
                track.SkipWhenShuffling        = true;
                track.Flag4        = (byte)1;
                track.MarkUnplayed = (track.PlayCount == 0);
            }

            track.MediaType = GPod.MediaType.Audio;
            if (HasAttribute(TrackMediaAttributes.VideoStream))
            {
                if (HasAttribute(TrackMediaAttributes.Podcast))
                {
                    track.MediaType = GPod.MediaType.Podcast | GPod.MediaType.Movie;
                }
                else if (HasAttribute(TrackMediaAttributes.Music))
                {
                    if (HasAttribute(TrackMediaAttributes.TvShow))
                    {
                        track.MediaType = GPod.MediaType.MusicTVShow;
                    }
                    else
                    {
                        track.MediaType = GPod.MediaType.MusicVideo;
                    }
                }
                else if (HasAttribute(TrackMediaAttributes.Movie))
                {
                    track.MediaType = GPod.MediaType.Movie;
                }
                else if (HasAttribute(TrackMediaAttributes.TvShow))
                {
                    track.MediaType = GPod.MediaType.TVShow;
                }
                else
                {
                    // I dont' think AudioVideo should be used here; upon loading the tracks
                    // into Banshee, audio files often have AudioVideo (aka MediaType == 0) too.
                    //track.MediaType = GPod.MediaType.AudioVideo;
                    track.MediaType = GPod.MediaType.Movie;
                }
            }
            else
            {
                if (HasAttribute(TrackMediaAttributes.Podcast))
                {
                    track.MediaType = GPod.MediaType.Podcast;
                }
                else if (HasAttribute(TrackMediaAttributes.AudioBook))
                {
                    track.MediaType = GPod.MediaType.Audiobook;
                }
                else if (HasAttribute(TrackMediaAttributes.Music))
                {
                    track.MediaType = GPod.MediaType.Audio;
                }
                else
                {
                    track.MediaType = GPod.MediaType.Audio;
                }
            }

            if (addTrack)
            {
                track.Filetype = mimetype;

                database.Tracks.Add(IpodTrack);
                database.MasterPlaylist.Tracks.Add(IpodTrack);

                if (HasAttribute(TrackMediaAttributes.Podcast) && database.Device.SupportsPodcast)
                {
                    database.PodcastsPlaylist.Tracks.Add(IpodTrack);
                }

                database.CopyTrackToIPod(track, Uri.LocalPath);
                Uri        = new SafeUri(GPod.ITDB.GetLocalPath(database.Device, track));
                ExternalId = (long)IpodTrack.DBID;
            }

            if (CoverArtSpec.CoverExists(ArtworkId))
            {
                string path = CoverArtSpec.GetPath(ArtworkId);
                if (!track.ThumbnailsSet(path))
                {
                    Log.Error(String.Format("Could not set cover art for {0}.", path));
                }
            }
            else
            {
                track.ThumbnailsRemoveAll();
            }
        }