[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: extragear/multimedia/amarok/src/mediadevice/ipod
From: Martin Aumüller <aumuell () reserv ! at>
Date: 2007-12-15 9:25:50
Message-ID: 1197710750.131986.31793.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 748741 by aumuell:
merge -r732635:744778 from stable
M +160 -33 ipodmediadevice.cpp
M +3 -1 ipodmediadevice.h
--- trunk/extragear/multimedia/amarok/src/mediadevice/ipod/ipodmediadevice.cpp \
#748740:748741 @@ -75,9 +75,6 @@
#endif
-// disable if it takes too long for you
-#define CHECK_FOR_INTEGRITY 1
-
#include "metadata/audible/taglib_audiblefile.h"
struct PodcastInfo
@@ -268,13 +265,15 @@
m_playlistItem = 0;
m_supportsArtwork = true;
m_supportsVideo = false;
- m_isShuffle = true;
+ m_isShuffle = false;
m_isMobile = false;
+ m_needsFirewireGuid = false;
m_requireMount = true;
m_name = "iPod";
// config stuff
+ m_autoConnect = true;
m_syncStatsCheck = 0;
m_autoDeletePodcastsCheck = 0;
@@ -355,9 +354,29 @@
gchar model[PATH_MAX];
g_snprintf (model, PATH_MAX, "x%s", table[index].model_number);
- itdb_device_set_sysinfo( m_itdb->device,
- "ModelNumStr", model );
+ itdb_device_set_sysinfo( m_itdb->device, "ModelNumStr", model );
+ detectModel();
+ if( m_isIPhone )
+ {
+ m_autoConnect = false;
+ setConfigBool( "AutoConnect", m_autoConnect );
+ }
+
+ // try to make sure that the Device directory exists
+ QDir dir;
+ QString realPath;
+ if(!pathExists( itunesDir(), &realPath) )
+ {
+ dir.setPath(realPath);
+ dir.mkdir(dir.absPath());
+ }
+ if(!pathExists( itunesDir( "Device" ), &realPath) )
+ {
+ dir.setPath(realPath);
+ dir.mkdir(dir.absPath());
+ }
+
GError *err = 0;
gboolean success = itdb_device_write_sysinfo(m_itdb->device, \
&err);
debug() << "success writing sysinfo to ipod?: " << success;
@@ -366,7 +385,7 @@
g_error_free(err);
//FIXME: update i18n files for next message
Amarok::ContextStatusBar::instance()->longMessage(
- i18n( "Could not write sysinfo file to ipod (check \
the permissions of the file \"iPod_Control/Device/SysInfo\" on your iPod)" ) ); + \
i18n( "Could not write SysInfo file to iPod (check the permissions of the file \"%1\" \
on your iPod)" ).arg( itunesDir( "Device:SysInfo" ) ) );
//FIXME: update i18n files for next message
Amarok::ContextStatusBar::instance()->shortMessage(
@@ -383,9 +402,8 @@
itdb_info_get_ipod_model_name_string( \
table[index].ipod_model ), table[index].model_number ) );
}
+ MediaBrowser::instance()->updateDevices();
}
- detectModel();
- MediaBrowser::instance()->updateDevice();
}
break;
}
@@ -451,7 +469,8 @@
track->artist = g_strdup( metaBundle.artist()->utf8() );
track->genre = g_strdup( metaBundle.genre()->utf8() );
- track->mediatype = 0x01; // for audio
+ track->mediatype = ITDB_MEDIATYPE_AUDIO;
+ bool audiobook = false;
if(type=="wav")
{
track->filetype = g_strdup( "wav" );
@@ -466,21 +485,19 @@
}
else if(type=="m4b")
{
+ audiobook = true;
track->filetype = g_strdup( "mp4" );
- track->remember_playback_position |= 0x01; // remember current position in \
track
- track->mediatype = 0x08; // for audiobooks
}
else if(type=="m4v" || type=="mp4v" || type=="mov" || type=="mpg" || \
type=="mp4") {
track->filetype = g_strdup( "m4v video" );
track->movie_flag = 0x01; // for videos
- track->mediatype = 0x02; // for videos
+ track->mediatype = ITDB_MEDIATYPE_MOVIE;
}
else if(type=="aa")
{
+ audiobook = true;
track->filetype = g_strdup( "audible" );
- track->remember_playback_position |= 0x01; // remember current position in \
track
- track->mediatype = 0x08; // for audiobooks
TagLib::Audible::File f( TagLibEncodeName( propertiesBundle.url().path() ) \
); TagLib::Audible::Tag *t = f.getAudibleTag();
@@ -489,12 +506,24 @@
// libgpod also tries to set those, but this won't work
track->unk126 = 0x01;
track->unk144 = 0x0029;
+
}
else
{
track->filetype = g_strdup( type.toUtf8() );
}
+
+ QString genre = metaBundle.genre();
+ if( genre.startsWith("audiobook", false) )
+ audiobook = true;
+ if( audiobook )
+ {
+ track->remember_playback_position |= 0x01;
+ track->skip_when_shuffling |= 0x01;
+ track->mediatype = ITDB_MEDIATYPE_AUDIOBOOK;
+ }
+
track->composer = g_strdup( metaBundle.composer()->utf8() );
track->comment = g_strdup( metaBundle.comment()->utf8() );
track->track_nr = metaBundle.track();
@@ -529,7 +558,10 @@
track->remember_playback_position = 0x01; // remember playback position
// FIXME: track->unk176 = 0x00020000; // for podcasts
track->mark_unplayed = podcastInfo->listened ? 0x01 : 0x02;
- track->mediatype = track->mediatype==0x02 ? 0x06 : 0x04; // video or audio \
podcast + track->mediatype =
+ track->mediatype==ITDB_MEDIATYPE_MOVIE
+ ? ITDB_MEDIATYPE_PODCAST | ITDB_MEDIATYPE_MOVIE
+ : ITDB_MEDIATYPE_PODCAST;
track->flag4 = 0x01; // also show description on iPod
QString plaindesc = podcastInfo->description;
@@ -544,8 +576,6 @@
}
else
{
- // FIXME: track->unk176 = 0x00010000; // for non-podcasts
-
if( metaBundle.compilation() == MetaBundle::CompilationYes )
{
track->compilation = 0x01;
@@ -613,7 +643,7 @@
Itdb_Playlist *mpl = itdb_playlist_mpl(m_itdb);
if( !mpl )
{
- mpl = itdb_playlist_new( "MPL", false );
+ mpl = itdb_playlist_new( "iPod", false );
itdb_playlist_add( m_itdb, mpl, -1 );
itdb_playlist_set_mpl( mpl );
addPlaylistToView( mpl );
@@ -1014,6 +1044,9 @@
if( m_itdb == 0 )
return false;
+ // in order to get directories right
+ detectModel();
+
itdb_set_mountpoint(m_itdb, QFile::encodeName(mountPoint()));
Itdb_Playlist *mpl = itdb_playlist_new("iPod", false);
@@ -1061,10 +1094,12 @@
bool
IpodMediaDevice::openDevice( bool silent )
{
- m_isShuffle = true;
+ m_isShuffle = false;
m_isMobile = false;
m_supportsArtwork = false;
m_supportsVideo = false;
+ m_needsFirewireGuid = false;
+ m_rockboxFirmware = false;
m_dbChanged = false;
m_files.clear();
@@ -1180,9 +1215,6 @@
return false;
}
- m_isShuffle = true;
- m_supportsArtwork = true;
-
for( int i=0; i < itdb_musicdirs_number(m_itdb); i++)
{
QString real;
@@ -1230,23 +1262,56 @@
updateRootItems();
m_customAction->setEnabled( true );
+ m_dbChanged = true; // write at least once for synchronising new stats
+
return true;
}
void
IpodMediaDevice::detectModel()
{
+ // set some sane default values
+ m_isShuffle = false;
+ m_supportsArtwork = true;
+ m_supportsVideo = false;
+ m_isIPhone = false;
+ m_needsFirewireGuid = false;
+ m_rockboxFirmware = false;
+
// needs recent libgpod-0.3.3 from cvs
+ bool guess = false;
if( m_itdb && m_itdb->device )
{
const Itdb_IpodInfo *ipodInfo = itdb_device_get_ipod_info( m_itdb->device );
const gchar *modelString = 0;
+ m_supportsArtwork = itdb_device_supports_artwork( m_itdb->device );
+
if( ipodInfo )
{
modelString = itdb_info_get_ipod_model_name_string ( \
ipodInfo->ipod_model );
switch( ipodInfo->ipod_model )
{
+ case ITDB_IPOD_MODEL_SHUFFLE:
+#ifdef HAVE_LIBGPOD_060
+ case ITDB_IPOD_MODEL_SHUFFLE_SILVER:
+ case ITDB_IPOD_MODEL_SHUFFLE_PINK:
+ case ITDB_IPOD_MODEL_SHUFFLE_BLUE:
+ case ITDB_IPOD_MODEL_SHUFFLE_GREEN:
+ case ITDB_IPOD_MODEL_SHUFFLE_ORANGE:
+ case ITDB_IPOD_MODEL_SHUFFLE_PURPLE:
+#endif
+ m_isShuffle = true;
+ break;
+#ifdef HAVE_LIBGPOD_060
+ case ITDB_IPOD_MODEL_IPHONE_1:
+ case ITDB_IPOD_MODEL_TOUCH_BLACK:
+ m_isIPhone = true;
+ debug() << "detected iPhone/iPod Touch" << endl;
+ break;
+ case ITDB_IPOD_MODEL_CLASSIC_SILVER:
+ case ITDB_IPOD_MODEL_CLASSIC_BLACK:
+#endif
case ITDB_IPOD_MODEL_VIDEO_WHITE:
case ITDB_IPOD_MODEL_VIDEO_BLACK:
case ITDB_IPOD_MODEL_VIDEO_U2:
@@ -1255,31 +1320,88 @@
break;
case ITDB_IPOD_MODEL_MOBILE_1:
m_isMobile = true;
- debug() << "detected iTunes phone";
+ debug() << "detected iTunes phone" << endl;
break;
case ITDB_IPOD_MODEL_INVALID:
case ITDB_IPOD_MODEL_UNKNOWN:
modelString = 0;
- if( pathExists( ":iTunes:iTunes_Control" ) )
- {
- debug() << "iTunes/iTunes_Control found - assuming itunes \
phone";
- m_isMobile = true;
- }
+ guess = true;
break;
default:
break;
}
+
+#ifdef HAVE_LIBGPOD_060
+ switch( ipodInfo->ipod_generation )
+ {
+ case ITDB_IPOD_GENERATION_CLASSIC_1:
+ case ITDB_IPOD_GENERATION_NANO_3:
+ case ITDB_IPOD_GENERATION_TOUCH_1:
+ m_needsFirewireGuid = true;
+ m_supportsVideo = true;
+ break;
+ case ITDB_IPOD_GENERATION_VIDEO_1:
+ case ITDB_IPOD_GENERATION_VIDEO_2:
+ m_supportsVideo = true;
+ break;
+ case ITDB_IPOD_GENERATION_SHUFFLE_1:
+ case ITDB_IPOD_GENERATION_SHUFFLE_2:
+ case ITDB_IPOD_GENERATION_SHUFFLE_3:
+ m_isShuffle = true;
+ break;
+ default:
+ break;
+ }
+#endif
}
-
if( modelString )
m_name = QString( "iPod %1" ).arg( QString::fromUtf8( modelString ) );
+
+ if( m_needsFirewireGuid )
+ {
+ gchar *fwid = itdb_device_get_sysinfo( m_itdb->device, "FirewireGuid" );
+ if( !fwid )
+ {
+ Amarok::StatusBar::instance()->longMessage(
+ i18n("Your iPod's Firewire GUID is required for correctly \
updating its music database, but it is not known. See %1 for more information.").arg( \
"http://amarok.kde.org/wiki/Media_Device:IPod" ) ); + }
+ else
+ g_free( fwid );
+ }
}
else
{
debug() << "iPod type detection failed, no video support";
Amarok::ContextStatusBar::instance()->longMessage(
i18n("iPod type detection failed: no support for iPod Shuffle, for \
artwork or video") ); + guess = true;
}
+
+ if( guess )
+ {
+ if( pathExists( ":iTunes:iTunes_Control" ) )
+ {
+ debug() << "iTunes/iTunes_Control found - assuming itunes phone" << \
endl; + m_isMobile = true;
+ }
+ else if( pathExists( ":iTunes_Control" ) )
+ {
+ debug() << "iTunes_Control found - assuming iPhone/iPod Touch" << endl;
+ m_isIPhone = true;
+ }
+ }
+
+ if( m_isIPhone )
+ {
+ m_supportsVideo = true;
+ m_supportsArtwork = true;
+ }
+
+ if( pathExists( ":.rockbox" ) )
+ {
+ debug() << "RockBox firmware detected" << endl;
+ m_rockboxFirmware = true;
+ }
}
void
@@ -1354,6 +1476,9 @@
Amarok::ContextStatusBar::instance()->shortMessage(
i18np( "Updated artwork for one track", "Updated artwork for %1 tracks", \
updateCount ) ); +
+ if(!m_dbChanged)
+ m_dbChanged = updateCount > 0;
}
@@ -1516,7 +1641,8 @@
}
}
- if(!stale && m_masterPlaylist && itdb_playlist_contains_track(m_masterPlaylist, \
track)) + if(!stale && m_masterPlaylist && \
itdb_playlist_contains_track(m_masterPlaylist, track) + && \
(!m_podcastPlaylist || !itdb_playlist_contains_track(m_podcastPlaylist, track))) {
visible = true;
@@ -1781,8 +1907,8 @@
bool
IpodMediaDevice::writeITunesDB( bool threaded )
{
- if(m_itdb)
- m_dbChanged = true; // write unconditionally for resetting recent_playcount
+ if(!m_itdb)
+ return false;
if(m_dbChanged)
{
@@ -2471,6 +2597,7 @@
m_syncStats = configBool( "SyncStats", false );
m_autoDeletePodcasts = configBool( "AutoDeletePodcasts", false );
+ m_autoConnect = configBool( "AutoConnect", true );
}
bool
--- trunk/extragear/multimedia/amarok/src/mediadevice/ipod/ipodmediadevice.h \
#748740:748741 @@ -58,7 +58,7 @@
IpodMediaDevice();
void init( MediaBrowser* parent );
virtual ~IpodMediaDevice();
- virtual bool autoConnect() { return true; }
+ virtual bool autoConnect() { return m_autoConnect; }
virtual bool asynchronousTransfer() { return false; /* kernel buffer \
flushes freeze Amarok */ } QStringList supportedFiletypes();
@@ -144,6 +144,8 @@
bool m_isMobile;
bool m_supportsArtwork;
bool m_supportsVideo;
+ bool m_needsFirewireGuid;
+ bool m_autoConnect;
IpodMediaItem *getArtist( const QString &artist );
IpodMediaItem *getAlbum( const QString &artist, const QString &album );
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic