Esempio n. 1
0
    def send_file_to_ipod(self, itdb, fname, tags):
        if not os.path.exists(fname):
            logger.error("File '%s' does not exist" % fname)
            return False

        logger.debug("Copying file '%s' to iPod..." % fname)
        podcasts = gpod.itdb_playlist_podcasts(itdb)
        track = gpod.itdb_track_new()
        track.visible = 1
        track.filetype = "mp3"
        track.ipod_path = fname
        track.album = str(tags['album'])
        track.artist = str(tags['artist'])
        track.title = str(tags['title'])
        track.genre = str(tags['genre'])
        track.tracklen = tags['length']
        track.playcount = 0
        gpod.itdb_track_add(itdb, track, -1)
        gpod.itdb_playlist_add_track(podcasts, track, -1)
        is_copied = gpod.itdb_cp_track_to_ipod(track, fname, None)
        if is_copied:
            logger.info("File '%s' has been successfully copied to iPod" % fname)
        else:
            # roll back
            logger.error("File '%s' could not be copied to iPod" % fname)
            gpod.itdb_playlist_remove_track(podcasts, track)
            gpod.itdb_track_remove(track)
        track = None
        gpod.itdb_write(itdb, None)
        return is_copied
Esempio n. 2
0
 def copyToiPod(self,itdb,filename):
     """
     Copy file to iPod via gpod library.
     """
     track = gpod.itdb_track_new()
     pl=gpod.itdb_playlist_podcasts(itdb)
     audiofile = eyeD3.Mp3AudioFile(filename)
     tag = audiofile.getTag()
     for func, attrib in (('getArtist','artist'),
                          ('getTitle','title'),
                          ('getBPM','BPM'),
                          ('getPlayCount','playcount'),
                          ('getAlbum','album')):
         value = getattr(tag,func)()
         if value:
             value = value.encode("utf-8")
             setattr(track,attrib,value)
     track.skip_when_shuffling=0x01
     track.remember_playback_position=0x01
     track.mediatype = 0x00000004
     track.mark_unplayed = 0x02
     #track.flag4=0x01
     track.tracklen = audiofile.getPlayTime() * 1000
     gpod.itdb_track_add(itdb, track, -1)
     gpod.itdb_playlist_add_track(pl, track, -1)
     if gpod.itdb_cp_track_to_ipod(track,filename, None)!= 1:
         raise Exception('Unable to copy %s to iPod' % filename)
Esempio n. 3
0
    def add(self, track, pos=-1):
        """Add a track to the playlist.

        track is a track object to add.

        If pos is set the track will be inserted at that position.  By
        default the track will be added at the end of the playlist.

        """

        gpod.itdb_playlist_add_track(self._pl, track._track, pos)
Esempio n. 4
0
    def import_file(self, filename):
        """Import a file.

        filename is added to the end of the master playlist.

        """
        track = Track(filename)
        track.copy_to_ipod()
        gpod.itdb_playlist_add_track(gpod.itdb_playlist_mpl(self._itdb),
                                     track._track, -1)
        track.__database = self  # so the db doesn't get gc'd
Esempio n. 5
0
    def add(self, track, pos=-1):
        """Add a track to the playlist.

        track is a track object to add.

        If pos is set the track will be inserted at that position.  By
        default the track will be added at the end of the playlist.

        """

        gpod.itdb_playlist_add_track(self._pl, track._track, pos)
Esempio n. 6
0
    def import_file(self, filename):
        """Import a file.

        filename is added to the end of the master playlist.

        """
        track = Track(filename)
        track.copy_to_ipod()
        gpod.itdb_playlist_add_track(gpod.itdb_playlist_mpl(self._itdb),
                                     track._track, -1)
        track.__database = self # so the db doesn't get gc'd
Esempio n. 7
0
    def add_track(self, episode, reporthook=None):
        self.notify('status', _('Adding %s') % episode.title)
        tracklist = gpod.sw_get_playlist_tracks(self.podcasts_playlist)
        podcasturls = [track.podcasturl for track in tracklist]

        if episode.url in podcasturls:
            # Mark as played on iPod if played locally (and set podcast flags)
            self.set_podcast_flags(tracklist[podcasturls.index(episode.url)],
                                   episode)
            return True

        original_filename = episode.local_filename(create=False)
        # The file has to exist, if we ought to transfer it, and therefore,
        # local_filename(create=False) must never return None as filename
        assert original_filename is not None
        local_filename = original_filename

        if util.calculate_size(original_filename) > self.get_free_space():
            logger.error('Not enough space on %s, sync aborted...',
                         self.mountpoint)
            d = {'episode': episode.title, 'mountpoint': self.mountpoint}
            message = _(
                'Error copying %(episode)s: Not enough free space on %(mountpoint)s'
            )
            self.errors.append(message % d)
            self.cancelled = True
            return False

        local_filename = episode.local_filename(create=False)

        (fn, extension) = os.path.splitext(local_filename)
        if extension.lower().endswith('ogg'):
            logger.error('Cannot copy .ogg files to iPod.')
            return False

        track = gpod.itdb_track_new()

        # Add release time to track if episode.published has a valid value
        if episode.published > 0:
            try:
                # libgpod>= 0.5.x uses a new timestamp format
                track.time_released = gpod.itdb_time_host_to_mac(
                    int(episode.published))
            except:
                # old (pre-0.5.x) libgpod versions expect mactime, so
                # we're going to manually build a good mactime timestamp here :)
                #
                # + 2082844800 for unixtime => mactime (1970 => 1904)
                track.time_released = int(episode.published + 2082844800)

        track.title = str(episode.title)
        track.album = str(episode.channel.title)
        track.artist = str(episode.channel.title)
        track.description = str(util.remove_html_tags(episode.description))

        track.podcasturl = str(episode.url)
        track.podcastrss = str(episode.channel.url)

        track.tracklen = get_track_length(local_filename)
        track.size = os.path.getsize(local_filename)

        if episode.file_type() == 'audio':
            track.filetype = 'mp3'
            track.mediatype = 0x00000004
        elif episode.file_type() == 'video':
            track.filetype = 'm4v'
            track.mediatype = 0x00000006

        self.set_podcast_flags(track, episode)

        gpod.itdb_track_add(self.itdb, track, -1)
        gpod.itdb_playlist_add_track(self.master_playlist, track, -1)
        gpod.itdb_playlist_add_track(self.podcasts_playlist, track, -1)
        copied = gpod.itdb_cp_track_to_ipod(track, str(local_filename), None)
        reporthook(episode.file_size, 1, episode.file_size)

        # If the file has been converted, delete the temporary file here
        if local_filename != original_filename:
            util.delete_file(local_filename)

        return True
Esempio n. 8
0
    def add_track(self, episode,reporthook=None):
        self.notify('status', _('Adding %s') % episode.title)
        tracklist = gpod.sw_get_playlist_tracks(self.podcasts_playlist)
        podcasturls=[track.podcasturl for track in tracklist]

        if episode.url in podcasturls:
            # Mark as played on iPod if played locally (and set podcast flags)
            self.set_podcast_flags(tracklist[podcasturls.index(episode.url)], episode)
            return True

        original_filename = episode.local_filename(create=False)
        # The file has to exist, if we ought to transfer it, and therefore,
        # local_filename(create=False) must never return None as filename
        assert original_filename is not None
        local_filename = original_filename

        if util.calculate_size(original_filename) > self.get_free_space():
            logger.error('Not enough space on %s, sync aborted...', self.mountpoint)
            d = {'episode': episode.title, 'mountpoint': self.mountpoint}
            message =_('Error copying %(episode)s: Not enough free space on %(mountpoint)s')
            self.errors.append(message % d)
            self.cancelled = True
            return False

        local_filename = episode.local_filename(create=False)

        (fn, extension) = os.path.splitext(local_filename)
        if extension.lower().endswith('ogg'):
            logger.error('Cannot copy .ogg files to iPod.')
            return False

        track = gpod.itdb_track_new()

        # Add release time to track if episode.published has a valid value
        if episode.published > 0:
            try:
                # libgpod>= 0.5.x uses a new timestamp format
                track.time_released = gpod.itdb_time_host_to_mac(int(episode.published))
            except:
                # old (pre-0.5.x) libgpod versions expect mactime, so
                # we're going to manually build a good mactime timestamp here :)
                #
                # + 2082844800 for unixtime => mactime (1970 => 1904)
                track.time_released = int(episode.published + 2082844800)

        track.title = str(episode.title)
        track.album = str(episode.channel.title)
        track.artist = str(episode.channel.title)
        track.description = str(util.remove_html_tags(episode.description))

        track.podcasturl = str(episode.url)
        track.podcastrss = str(episode.channel.url)

        track.tracklen = get_track_length(local_filename)
        track.size = os.path.getsize(local_filename)

        if episode.file_type() == 'audio':
            track.filetype = 'mp3'
            track.mediatype = 0x00000004
        elif episode.file_type() == 'video':
            track.filetype = 'm4v'
            track.mediatype = 0x00000006

        self.set_podcast_flags(track, episode)

        gpod.itdb_track_add(self.itdb, track, -1)
        gpod.itdb_playlist_add_track(self.master_playlist, track, -1)
        gpod.itdb_playlist_add_track(self.podcasts_playlist, track, -1)
        copied = gpod.itdb_cp_track_to_ipod(track, str(local_filename), None)
        reporthook(episode.file_size, 1, episode.file_size)

        # If the file has been converted, delete the temporary file here
        if local_filename != original_filename:
            util.delete_file(local_filename)

        return True
Esempio n. 9
0
def rebuild(mountpoint, ipod_name, dry_run=True):

    db = gpod.itdb_new()
    gpod.itdb_set_mountpoint(db, mountpoint)

    master = gpod.itdb_playlist_new(ipod_name, False)
    gpod.itdb_playlist_set_mpl(master)
    gpod.itdb_playlist_add(db, master, -1)

    mb_albumid_to_artwork = dict()

    def store_artwork(artwork_data, mb_albumid):

        import gio
        from gtk import gdk

        artwork_in = gio.memory_input_stream_new_from_data(artwork_data)

        pixbuf = gdk.pixbuf_new_from_stream(artwork_in, None)

        artwork = gpod.itdb_artwork_new()

        gpod.itdb_artwork_set_thumbnail_from_pixbuf(artwork, pixbuf, 0, None)

        mb_albumid_to_artwork[mb_albumid] = artwork

        return artwork

    def get_artwork(mb_albumid):
        return mb_albumid_to_artwork.get(mb_albumid)

    def action(path):

        from os import sep, stat
        from os.path import relpath

        from mutagen.m4a import M4AInfo

        relative_path = relpath(path, mountpoint)
        ipod_path = ":" + relative_path.replace(sep, ":")

        md_hard, md_easy = get_metadata(path)
        info = md_easy.info
        c = is_compilation(md_easy)

        track = gpod.itdb_track_new()

        track.title = get_first_utf8(md_easy, "title")
        track.artist = get_first_utf8(md_easy, "artist")
        track.album = get_first_utf8(md_easy, "album")
        track.compilation = c
        track.tracklen = int(info.length * 1000)
        track.bitrate = int(info.bitrate)
        track.samplerate = int(info.sample_rate)
        track.ipod_path = ipod_path
        track.size = stat(path).st_size

        if isinstance(info, M4AInfo):
            track.filetype = "M4A-file"
        else:
            track.filetype = "MP3-file"

        mb_albumid = get_first_utf8(md_easy, "musicbrainz_albumid", None)
        if mb_albumid is not None:

            existing_artwork = get_artwork(mb_albumid)
            if existing_artwork is not None:
                _log.debug(
                    "found existing artwork for track %r (%r-%r)",
                    path,
                    get_first(md_easy, "artist"),
                    get_first(md_easy, "album"),
                )
                artwork = existing_artwork
            else:
                artwork_data = get_any_artwork(md_hard)
                if artwork_data is not None:
                    _log.debug("storing artwork for track %r", path)
                    artwork = store_artwork(artwork_data, mb_albumid)
                else:
                    artwork = None
        else:
            artwork = None

        if artwork is not None:
            track.artwork = gpod.itdb_artwork_duplicate(artwork)

        try:
            track_number = get_first(md_easy, "tracknumber")
            disc_number = get_first(md_easy, "discnumber", "1")

            track_n = track_number.split("/")
            disc_n = disc_number.split("/")

            track.track_nr = int(track_n[0])
            track.cd_nr = int(disc_n[0])

            if len(track_n) > 1:
                track.tracks = int(track_n[1])

            if len(disc_n) > 1:
                track.cds = int(disc_n[1])

        except Exception, e:
            _log.error("%r %r", e, md_easy)

        gpod.itdb_track_add(db, track, -1)
        gpod.itdb_playlist_add_track(master, track, -1)
Esempio n. 10
0
    def add_track(self, episode):
        self.notify('status', _('Adding %s') % episode.title)
        for track in gpod.sw_get_playlist_tracks(self.podcasts_playlist):
            if episode.url == track.podcasturl:
                if track.playcount > 0:
                    gl.history_mark_played(track.podcasturl)
                # Mark as played on iPod if played locally (and set podcast flags)
                self.set_podcast_flags(track)
                return True

        original_filename=str(episode.local_filename())
        local_filename=original_filename

        # Reserve 10 MiB for iTunesDB writing (to be on the safe side)
        RESERVED_FOR_ITDB=1024*1024*10
        space_for_track=util.get_free_disk_space(self.mountpoint) - RESERVED_FOR_ITDB
        needed=util.calculate_size(local_filename)

        if needed > space_for_track:
            log('Not enough space on %s: %s available, but need at least %s', self.mountpoint, util.format_filesize(space_for_track), util.format_filesize(needed), sender=self)
            self.errors.append( _('Error copying %s: Not enough free disk space on %s') % (episode.title, self.mountpoint))
            self.cancelled=True
            return False

        (fn, extension)=os.path.splitext(original_filename)
        if libconverter.converters.has_converter(extension):
            log('Converting: %s', original_filename, sender=self)
            callback_status=lambda percentage: self.notify('sub-progress', int(percentage))
            local_filename=libconverter.converters.convert(original_filename, callback=callback_status)

            if not libtagupdate.update_metadata_on_file(local_filename, title=episode.title, artist=episode.channel.title):
                log('Could not set metadata on converted file %s', local_filename, sender=self)

            if local_filename is None:
                log('Cannot convert %s', original_filename, sender=self)
                return False
            else:
                local_filename=str(local_filename)

        (fn, extension)=os.path.splitext(local_filename)
        if extension.lower().endswith('ogg'):
            log('Cannot copy .ogg files to iPod.', sender=self)
            return False

        track=gpod.itdb_track_new()
        
        # Add release time to track if pubDate is parseable
        ipod_date=email.Utils.parsedate(episode.pubDate)
        if ipod_date is not None:
            try:
                # libgpod>= 0.5.x uses a new timestamp format
                track.time_released=gpod.itdb_time_host_to_mac(int(time.mktime(ipod_date)))
            except:
                # old (pre-0.5.x) libgpod versions expect mactime, so
                # we're going to manually build a good mactime timestamp here :)
                #
                # + 2082844800 for unixtime => mactime (1970 => 1904)
                track.time_released=int(time.mktime(ipod_date) + 2082844800)
        
        track.title=str(episode.title)
        track.album=str(episode.channel.title)
        track.artist=str(episode.channel.title)
        track.description=str(episode.description)

        track.podcasturl=str(episode.url)
        track.podcastrss=str(episode.channel.url)

        track.tracklen=get_track_length(local_filename)
        track.size=os.path.getsize(local_filename)

        if episode.file_type() == 'audio':
            track.filetype='mp3'
            track.mediatype=0x00000004
        elif episode.file_type() == 'video':
            track.filetype='m4v'
            track.mediatype=0x00000006

        self.set_podcast_flags(track)
        self.set_cover_art(track, local_filename)

        gpod.itdb_track_add(self.itdb, track, -1)
        gpod.itdb_playlist_add_track(self.podcasts_playlist, track, -1)
        gpod.itdb_cp_track_to_ipod( track, local_filename, None)

        # If the file has been converted, delete the temporary file here
        if local_filename != original_filename:
            util.delete_file(local_filename)

        return True
        print "test check for new playlist construction" 
        #Create our temp playlist and start putting tracks in it that meet our clean threshold 
        tmpPlaylistName = "Clean."+playlist.name
        tmpPlaylist = gpod.itdb_playlist_new(tmpPlaylistName, 0)
        gpod.itdb_playlist_add(itdb,tmpPlaylist,-1)

    if listPlaylists == False:
        #iterating over tracks on ipod (didn't pass the object representing tracks)
        for track in gpod.sw_get_playlist_tracks(playlist):
            print track.artist, "-" ,track.title
            explicitCount = explicit_count(track)
            print 'Explicit Count is: ' , explicitCount
            if explicitCount <= explicitThreshold and  \
                explicitCount >= 0:   #if this track is a keeper
		#Add our track to our already constructed playlist
                gpod.itdb_playlist_add_track(tmpPlaylist,track, -1)
            # TODO REMOVE THIS - this is JUST FOR TESTING
            #if track.title == "Some Song Title To Break On":
            #    print "***********BREAKING FOR TEST PURPOSES************"
            #    break

    if len(gpod.sw_get_playlist_tracks(tmpPlaylist)) > 0:
        log.warn("Writing a new clean playlist")
        log.warn("Created playlist \"" + tmpPlaylistName + "\" with " + str(len(gpod.sw_get_playlist_tracks(tmpPlaylist))) + " tracks")
        writeChanges = True

if writeChanges == False:
    print "No Changes to write"
elif noWrite:
    log.warn("NOT writing itdb (--no-write set)")
else:
Esempio n. 12
0
    track.grouping = f.grouping.encode('utf-8')

    #track.sort_artist = f.artist_sort.encode('utf-8')
    #track.sort_albumartist = f.albumartist_sort.encode('utf-8')
	
    #track.size = f.size
    track.tracklen = f.length * 1000

    if f.disc:
        track.cd_nr = f.disc
    if f.disctotal:
        track.cds = f.disctotal
    if f.track:
        track.track_nr = f.track
    if f.tracktotal:
        track.tracks = f.tracktotal
		
    track.bitrate = f.bitrate
    track.year = f.year
	
    track.visible = 1

    gpod.itdb_track_add(db, track, -1)
    gpod.itdb_playlist_add_track(gpod.itdb_playlist_mpl(db), track, -1)
    
# Write the database
if not (new_files or deleted_files):
	print "Not syncing: No files have been added, modified or removed."
else:	
	gpod.itdb_write(db, None)