Version: 1.4-svn (using KDE KDE 3.5.2) Installed from: Ubuntu Packages Compiler: GNU OS: Linux In future releases of Amarok can we have support for iTunes Mobile? (For those wondering, iTunes mobile is simply iTunes on a mobile device, like a cell phone.) This is generally a very easy request to implement (it is already implemented in gtkPod). It requires the development version of libgpod. Everything about iTunes mobile is identical to the iPod except for the directory structure (iTunes/iTunes_Control vs iPod_Control). I have verified this is indeed a trivial request by creating my own "iTunes Mobile" MediaDevice. Many thanks for this great product!
This sounds indeed like a reasonable wish. Will have a look at it some time soon.
Please test with the ipod plugin from svn - i can't as i don't have an itunes phone.
SVN commit 569229 by aumuell: support for using the ipod plugin with itunes phones - however initializing will not work because of the changed directory structure BUG: 131487 M +1 -0 ChangeLog M +2 -1 README M +23 -10 src/mediadevice/ipod/ipodmediadevice.cpp M +1 -0 src/mediadevice/ipod/ipodmediadevice.h --- trunk/extragear/multimedia/amarok/ChangeLog #569228:569229 @@ -7,6 +7,7 @@ VERSION 1.4.2: FEATURES: + * iPod plugin usable with iTunes phones. (BR 131487) * Browse collection by composer. (BR 122452) * New DCOP call "playlist: filenames" returns the filenames of the songs currently in the playlist. Patch by Arash Abedinzadeh --- trunk/extragear/multimedia/amarok/README #569228:569229 @@ -101,9 +101,10 @@ (CD burning support) http://www.k3b.org - * libgpod 0.3.2 + * libgpod 0.3.2 or newer (iPod support) http://www.gtkpod.org/libgpod.html + (libgpod from CVS is recommended because of many bug fixes) * libifp 1.0.0.2 (iRiver iFP support) --- trunk/extragear/multimedia/amarok/src/mediadevice/ipod/ipodmediadevice.cpp #569228:569229 @@ -764,7 +764,7 @@ IpodMediaDevice::createLockFile( bool silent ) { QString lockFilePath; - pathExists( ":iPod_Control:iTunes:iTunesLock", &lockFilePath ); + pathExists( itunesDir( "iTunes:iTunesLock" ), &lockFilePath ); m_lockFile = new QFile( lockFilePath ); QString msg; bool ok = true; @@ -839,7 +839,7 @@ itdb_playlist_add(m_itdb, mpl, 0); QString realPath; - if(!pathExists(":iPod_Control", &realPath) ) + if(!pathExists( itunesDir(), &realPath) ) { dir.setPath(realPath); dir.mkdir(dir.absPath()); @@ -847,7 +847,7 @@ if(!dir.exists()) return false; - if(!pathExists(":iPod_Control:Music", &realPath) ) + if(!pathExists( itunesDir( "Music" ), &realPath) ) { dir.setPath(realPath); dir.mkdir(dir.absPath()); @@ -855,7 +855,7 @@ if(!dir.exists()) return false; - if(!pathExists(":iPod_Control:iTunes", &realPath) ) + if(!pathExists( itunesDir( "iTunes" ), &realPath) ) { dir.setPath(realPath); dir.mkdir(dir.absPath()); @@ -1045,7 +1045,7 @@ { QString real; QString ipod; - ipod.sprintf( ":iPod_Control:Music:f%02d", i ); + ipod.sprintf( itunesDir( "Music:f%02d" ).latin1(), i ); if(!pathExists( ipod, &real ) ) { QDir dir( real ); @@ -1142,7 +1142,8 @@ cur = cur->next; } - QString musicpath = QString(itdb_get_mountpoint(m_itdb)) + "/iPod_Control/Music"; + QString musicpath; + pathExists( itunesDir( "Music" ), &musicpath ); QDir dir( musicpath, QString::null, QDir::Unsorted, QDir::Dirs ); for(unsigned i=0; i<dir.count(); i++) { @@ -1154,7 +1155,7 @@ for(unsigned j=0; j<hashdir.count(); j++) { QString filename = hashpath + "/" + hashdir[j]; - QString ipodPath = ":iPod_Control:Music:" + dir[i] + ":" + hashdir[j]; + QString ipodPath = itunesDir( "Music:" ) + dir[i] + ":" + hashdir[j]; Itdb_Track *track = m_files[ipodPath.lower()]; if(!track) { @@ -1425,6 +1426,18 @@ } QString +IpodMediaDevice::itunesDir(const QString &p) const +{ + QString base( ":iPod_Control" ); + if( m_isMobile ) + base = ":iTunes:iTunes_Control"; + + if( !p.startsWith( ":" ) ) + base += ":"; + return base + p; +} + +QString IpodMediaDevice::realPath(const char *ipodPath) { QString path; @@ -1726,7 +1739,7 @@ int music_dirs = itdb_musicdirs_number(m_itdb) > 0 ? itdb_musicdirs_number(m_itdb) : 20; int dir = num % music_dirs; QString dirname; - dirname.sprintf( ":iPod_Control:Music:f%02d", dir ); + dirname.sprintf( "%s:Music:f%02d", itunesDir().latin1(), dir ); if( !pathExists( dirname ) ) { QString realdir = realPath(dirname.latin1()); @@ -1788,8 +1801,8 @@ return false; #ifdef HAVE_STATVFS - QString path = QFile::decodeName(itdb_get_mountpoint(m_itdb)); - path.append("/iPod_Control"); + QString path; + pathExists( itunesDir(), &path ); struct statvfs buf; if(statvfs(QFile::encodeName(path), &buf) != 0) { --- trunk/extragear/multimedia/amarok/src/mediadevice/ipod/ipodmediadevice.h #569228:569229 @@ -100,6 +100,7 @@ void addPlaylistToView( Itdb_Playlist *playlist ); void playlistFromItem( IpodMediaItem *item ); + QString itunesDir( const QString &path = QString::null ) const; QString realPath( const char *ipodPath ); QString ipodPath( const QString &realPath ); bool pathExists( const QString &ipodPath, QString *realPath=0 );
Thank you very much! There was a small problem getting this to work correctly, which I have detailed in Bug 131910. (should have reopened the bug, apologies)