From: Seb R. <me...@se...> - 2006-09-24 08:34:42
Attachments:
rename_remove_photoalbums.diff
|
Hi Again! I also wrote a patch and set of tests to rename photo albums on the ipod. This diff is combined with the remove photo album patch, because of the annoyances of cvs and the likely conflicts that would be caused. Enjoy. Seb -- http://www.sebruiz.net/ |
From: Jorg S. <Jor...@gm...> - 2006-09-24 15:01:30
|
Hi Seb, thank you for your work. As you have seen I've been busy getting a release of gtkpod/libgpod out -- the last one is already 6 months back. That's why I'll look into your code in more detail later this week. Do you think you could resend the patch generated by cvs diff -u The '-u' makes it easier to read. For each (at least public) function you should write a short summary about its usage -- have a look at the other files for the required format. Cheers, JCS. Seb Ruiz wrote: > Hi Again! > > I also wrote a patch and set of tests to rename photo albums on the ipod. > > This diff is combined with the remove photo album patch, because of > the annoyances of cvs and the likely conflicts that would be caused. > > Enjoy. > Seb |
From: Seb R. <me...@se...> - 2006-09-24 21:54:52
Attachments:
remove_rename_photoalbums-1.diff
|
here is a diff with some more commenting and using diff -u. cheers, seb On 25/09/06, Jorg Schuler <Jor...@gm...> wrote: > Hi Seb, > > thank you for your work. As you have seen I've been busy getting a > release of gtkpod/libgpod out -- the last one is already 6 months back. > That's why I'll look into your code in more detail later this week. > > Do you think you could resend the patch generated by > > cvs diff -u > > The '-u' makes it easier to read. > > For each (at least public) function you should write a short summary > about its usage -- have a look at the other files for the required format. > > Cheers, > > > JCS. > > Seb Ruiz wrote: > > Hi Again! > > > > I also wrote a patch and set of tests to rename photo albums on the ipod. > > > > This diff is combined with the remove photo album patch, because of > > the annoyances of cvs and the likely conflicts that would be caused. > > > > Enjoy. > > Seb > > > ------------------------------------------------------------------------- > Take Surveys. Earn Cash. Influence the Future of IT > Join SourceForge.net's Techsay panel and you'll get the chance to share your > opinions on IT & business topics through brief surveys -- and earn cash > http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV > _______________________________________________ > Gtkpod-devel mailing list > Gtk...@li... > https://lists.sourceforge.net/lists/listinfo/gtkpod-devel > -- http://www.sebruiz.net/ |
From: Seb R. <me...@se...> - 2006-09-24 23:03:57
|
I've just noticed that 0.4.0 has been released without my patches... :(. This is upsetting to me because now I'll have to wait until the next libgpod release in order to release my application. Is it possible to get a 0.4.1 very soon? On 25/09/06, Seb Ruiz <me...@se...> wrote: > here is a diff with some more commenting and using diff -u. > > cheers, > seb > > On 25/09/06, Jorg Schuler <Jor...@gm...> wrote: > > Hi Seb, > > > > thank you for your work. As you have seen I've been busy getting a > > release of gtkpod/libgpod out -- the last one is already 6 months back. > > That's why I'll look into your code in more detail later this week. > > > > Do you think you could resend the patch generated by > > > > cvs diff -u > > > > The '-u' makes it easier to read. > > > > For each (at least public) function you should write a short summary > > about its usage -- have a look at the other files for the required format. > > > > Cheers, > > > > > > JCS. > > > > Seb Ruiz wrote: > > > Hi Again! > > > > > > I also wrote a patch and set of tests to rename photo albums on the ipod. > > > > > > This diff is combined with the remove photo album patch, because of > > > the annoyances of cvs and the likely conflicts that would be caused. > > > > > > Enjoy. > > > Seb > > > > > > ------------------------------------------------------------------------- > > Take Surveys. Earn Cash. Influence the Future of IT > > Join SourceForge.net's Techsay panel and you'll get the chance to share your > > opinions on IT & business topics through brief surveys -- and earn cash > > http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV > > _______________________________________________ > > Gtkpod-devel mailing list > > Gtk...@li... > > https://lists.sourceforge.net/lists/listinfo/gtkpod-devel > > > > > -- > http://www.sebruiz.net/ > > > -- http://www.sebruiz.net/ |
From: Jorg S. <Jor...@gm...> - 2006-09-24 23:40:18
|
Hi Seb, I couldn't wait too much longer with a release as people started complaining about segfaults in the old libgpod and their new iPods... Yes, we can make a new release soon. You can publish your application anyway and require libgpod>=0.4.1 -- which is the CVS version, as soon as we apply the patches. Cheers, JCS. Seb Ruiz wrote: > I've just noticed that 0.4.0 has been released without my patches... > :(. This is upsetting to me because now I'll have to wait until the > next libgpod release in order to release my application. > > Is it possible to get a 0.4.1 very soon? > > On 25/09/06, Seb Ruiz <me...@se...> wrote: >> here is a diff with some more commenting and using diff -u. >> >> cheers, >> seb >> >> On 25/09/06, Jorg Schuler <Jor...@gm...> wrote: >>> Hi Seb, >>> >>> thank you for your work. As you have seen I've been busy getting a >>> release of gtkpod/libgpod out -- the last one is already 6 months back. >>> That's why I'll look into your code in more detail later this week. >>> >>> Do you think you could resend the patch generated by >>> >>> cvs diff -u >>> >>> The '-u' makes it easier to read. >>> >>> For each (at least public) function you should write a short summary >>> about its usage -- have a look at the other files for the required format. >>> >>> Cheers, >>> >>> >>> JCS. >>> >>> Seb Ruiz wrote: >>>> Hi Again! >>>> >>>> I also wrote a patch and set of tests to rename photo albums on the ipod. >>>> >>>> This diff is combined with the remove photo album patch, because of >>>> the annoyances of cvs and the likely conflicts that would be caused. >>>> >>>> Enjoy. >>>> Seb |
From: Jorg S. <Jor...@gm...> - 2006-09-25 14:42:25
|
Hi Seb, I'm just going over your patch. I'll be brief -- please don't take this as being rude. > Index: src/itdb.h > +gboolean itdb_photodb_remove_photoalbum (Itdb_PhotoDB *db, > + const gchar *album_name); > +gboolean itdb_photodb_rename_photoalbum (Itdb_PhotoDB *db, > + const gchar *album_name, const gchar *new_album_name); I would go for a different API. I guess there is no requirement that all album names are different. Therefore the first API should be void itdb_photodb_photoalbum_remove (Itdb_PhotoDB *db, Itdb_PhotoAlbum *album); and itdb_photodb_rename_photoalbum is not needed any more. Instead itdb_photodb_photoalbum_by_name() would be useful. BTW: Can one and the same photo appear in more than one album? That would require some more functions. > + * itdb_photodb_remove_photoalbum column missing. > + * @photodb: the #Itdb_PhotoDB to apply changes to > + * @album_name: the name of the photoalbum to remove from the database > + * > + * Return value: TRUE on success, FALSE if the album specified by @album_name could not > + * be found in the database. > + */ > +gboolean itdb_photodb_remove_photoalbum (Itdb_PhotoDB *db, const gchar *album_name) > +{ > + gboolean result = TRUE; > + GList *it; > + > + g_return_val_if_fail (db, FALSE); > + g_return_val_if_fail (album_name, FALSE); > + > + /* Remove all the photos within that album from the library */ > + for (it = db->photoalbums; it != NULL; it = it->next ) > + { > + Itdb_PhotoAlbum *album; > + GList *it2; > + > + album = (Itdb_PhotoAlbum*)it->data; > + g_return_val_if_fail (album, FALSE); > + /* Have we found the desired album? */ > + if ( strcmp (album->name, album_name) == 0 ) > + { > + /* iterate over the photos within that album and remove them from the database */ > + for (it2 = album->members; it2 != NULL; it2 = it2->next ) > + { > + gint photo_id = GPOINTER_TO_INT(it2->data); > + g_print (_("Deleting photo with id: %d\n"), photo_id); > + result = itdb_photodb_remove_photo (db, photo_id); Change the API for itdb_photodb_remove_photo() to void -- it always returns TRUE. Rename it to itdb_photodb_photo_remove(). > + if (result == FALSE) > + break; > + } > + /* remove the album only if all members were successfully removed */ > + if (result == TRUE ) > + { > + g_print (_("Successfuly remove album photos, removing album (%s) now.\n"), album_name ); > + db->photoalbums = g_list_remove (db->photoalbums, album); memory leak -- need to free the photoalbum (...photoalbum_free()). > + } > + return result; > + } > + } > + /* If we made it here, then there was no album by that name */ > + return FALSE; > +} > + > +gboolean itdb_photodb_rename_photoalbum (Itdb_PhotoDB *db, > + const gchar *album_name, const gchar *new_album_name) As mentioned above, this should not be necessary -- replace with ..._by_name(). > +{ > + GList *it; > + > + g_return_val_if_fail (db, FALSE); > + g_return_val_if_fail (album_name, FALSE); > + g_return_val_if_fail (new_album_name, FALSE); > + > + for (it = db->photoalbums; it != NULL; it = it->next ) > + { > + Itdb_PhotoAlbum *album; > + > + album = (Itdb_PhotoAlbum*)it->data; > + g_return_val_if_fail (album, FALSE); > + /* Have we found the desired album? */ > + if (strcmp (album->name, album_name) == 0 ) > + { > + strcpy (album->name,new_album_name); Memory leak -- need to g_free (album->name) first. > + return TRUE; > + } > + } > + /* Obviously the source album wasn't found */ > + return FALSE; > +} > + So far for now. Everyone: you don't have to agree with what I write here. If you don't, speak up! Cheers, JCS. |
From: Seb R. <me...@se...> - 2006-09-25 22:37:01
|
Thanks for going over this. > > Index: src/itdb.h > > +gboolean itdb_photodb_remove_photoalbum (Itdb_PhotoDB *db, > > + const gchar *album_name); > > +gboolean itdb_photodb_rename_photoalbum (Itdb_PhotoDB *db, > > + const gchar *album_name, const gchar *new_album_name); > > I would go for a different API. I guess there is no requirement that all > album names are different. Therefore the first API should be > > void itdb_photodb_photoalbum_remove (Itdb_PhotoDB *db, > Itdb_PhotoAlbum *album); Okay, done > and itdb_photodb_rename_photoalbum is not needed any more. Instead > itdb_photodb_photoalbum_by_name() would be useful. How would this new method help renaming the album? > BTW: Can one and the same photo appear in more than one album? That > would require some more functions. Perhaps, but this should go in itdb_photodb_remove_photo, not the methods which I wrote. Deleting an image from an album shouldn't necessarily remove it from all albums. > > + * itdb_photodb_remove_photoalbum > > column missing. What do you mean a column is missing? > > + * @photodb: the #Itdb_PhotoDB to apply changes to > > + * @album_name: the name of the photoalbum to remove from the database > > + * > > + * Return value: TRUE on success, FALSE if the album specified by @album_name could not > > + * be found in the database. > > + */ > > +gboolean itdb_photodb_remove_photoalbum (Itdb_PhotoDB *db, const gchar *album_name) > > +{ > > + gboolean result = TRUE; > > + GList *it; > > + > > + g_return_val_if_fail (db, FALSE); > > + g_return_val_if_fail (album_name, FALSE); > > + > > + /* Remove all the photos within that album from the library */ > > + for (it = db->photoalbums; it != NULL; it = it->next ) > > + { > > + Itdb_PhotoAlbum *album; > > + GList *it2; > > + > > + album = (Itdb_PhotoAlbum*)it->data; > > + g_return_val_if_fail (album, FALSE); > > + /* Have we found the desired album? */ > > + if ( strcmp (album->name, album_name) == 0 ) > > + { > > + /* iterate over the photos within that album and remove them from the database */ > > + for (it2 = album->members; it2 != NULL; it2 = it2->next ) > > + { > > + gint photo_id = GPOINTER_TO_INT(it2->data); > > + g_print (_("Deleting photo with id: %d\n"), photo_id); > > + result = itdb_photodb_remove_photo (db, photo_id); > > Change the API for itdb_photodb_remove_photo() to void -- it always > returns TRUE. Rename it to itdb_photodb_photo_remove(). Ok, done. > > + { > > + g_print (_("Successfuly remove album photos, removing album (%s) now.\n"), album_name ); > > + db->photoalbums = g_list_remove (db->photoalbums, album); > > memory leak -- need to free the photoalbum (...photoalbum_free()). done > > +gboolean itdb_photodb_rename_photoalbum (Itdb_PhotoDB *db, > > + const gchar *album_name, const gchar *new_album_name) > > > As mentioned above, this should not be necessary -- replace with > ..._by_name(). (As above, how does this help us rename an album?) > > + if (strcmp (album->name, album_name) == 0 ) > > + { > > + strcpy (album->name,new_album_name); > > Memory leak -- need to g_free (album->name) first. okay Thanks for the feedback, I'll have another patch ready soon. -- http://www.sebruiz.net/ |
From: Jorg S. <Jor...@gm...> - 2006-09-26 10:28:35
|
> Okay, done > >> and itdb_photodb_rename_photoalbum is not needed any more. Instead >> itdb_photodb_photoalbum_by_name() would be useful. > > How would this new method help renaming the album? Once you got the photoalbum, just rename it manually (g_free, g_strcpy). There aren't any APIs to rename tracks or playlists either. >> BTW: Can one and the same photo appear in more than one album? That >> would require some more functions. > > Perhaps, but this should go in itdb_photodb_remove_photo, not the > methods which I wrote. > Deleting an image from an album shouldn't necessarily remove it from all albums. As I said -- if yes, we should add functions to handle this. And since you are working on it... >>> + * itdb_photodb_remove_photoalbum >> column missing. > > What do you mean a column is missing? Like this: * itdb_photodb_remove_photoalbum: Cheers, JCS. |
From: Seb R. <me...@se...> - 2006-09-27 14:35:52
Attachments:
photoalbum.diff
|
Okay, here is a new, simpler and better patch. On 26/09/06, Jorg Schuler <Jor...@gm...> wrote: > > Okay, done > > > >> and itdb_photodb_rename_photoalbum is not needed any more. Instead > >> itdb_photodb_photoalbum_by_name() would be useful. > > > > How would this new method help renaming the album? > > Once you got the photoalbum, just rename it manually (g_free, g_strcpy). > There aren't any APIs to rename tracks or playlists either. Sure, tried and tested - works. > >> BTW: Can one and the same photo appear in more than one album? That > >> would require some more functions. > > > > Perhaps, but this should go in itdb_photodb_remove_photo, not the > > methods which I wrote. > > Deleting an image from an album shouldn't necessarily remove it from all albums. photodb_remove_photo currently removes all instances of that photo in the photodb. This makes sense when calling the function directly, but not when deleting an album. Perhaps we need to think about changing the way this works. I haven't touched it, but it should be very easy to do so. > >>> + * itdb_photodb_remove_photoalbum > >> column missing. Ah, hehe, i think you mean a colon. The other changes to the patch: - reduction of code - added more docs to other methods - photodb_remove_* methods return void, not bool (there was no error handling anyhow) - removed photodb_photoalbum_renamed as requested - added photodb_photoalbum_by_name to return an Itdb_PhotoAlbum Hope that makes you happy, Seb -- http://www.sebruiz.net/ |
From: Jorg S. <Jor...@gm...> - 2006-10-01 14:34:52
Attachments:
photoalbum2.diff
|
Hi Seb, patch looks good so far I think. Thanks for your work! There's one issue I think I've mentioned before. I've looked into how iTunes organizes photos: you can select different folders and each folder will show up as a photo album. In addition there will be a photo library with all photos. In this scenario it is clear that each photo can only be in one album. From the data structures it is evident that the iPod doesn't care in how many albums a photo shows up -- just in the same way as it doesn't matter in how many playlists a track shows up. iTunes photo handling will be incompatible with libgpod's anyway (you either use iTunes or libgpod) because the only option with iTunes is to either sync the iPod with predefined folders or not. Therefore I'd like to add the functionality to have photos show up in several albums. We can have libgpod take care of certain things, like making sure that the "photo library" photo album (simply the first album) is created when adding the first track. I think we have to change some things: 1) gboolean itdb_photodb_add_photo (Itdb_PhotoDB *db, const gchar *albumname, const gchar *filename); to gboolean itdb_photodb_add_photo (Itdb_PhotoDB *db, Itdb_PhotoAlbum *album, const gchar *filename); If @album==NULL, add to first album. If no albums exist, create photo library album. 2) void itdb_photodb_remove_photo (Itdb_PhotoDB *db, const gint photo_id ); should be changed to void itdb_photodb_remove_photoid (Itdb_PhotoDB *db, Itdb_PhotoAlbum *album, const gint photo_id ); If @album==NULL, remove photo_id completely, as is the case now. Otherwise only remove from the album indicated. Make sure that if @album is the first album, that it is treated the same as @album==NULL. 3) void itdb_photodb_photoalbum_remove (Itdb_PhotoDB *db, Itdb_PhotoAlbum *pa ); could be extended to void itdb_photodb_photoalbum_remove (Itdb_PhotoDB *db, Itdb_PhotoAlbum *pa, gboolean remove_pics ); Only if @remove_pics is TRUE would itdb_photodb_remove_photoid (db, NULL, photo_id) be called for every photo in the album. Otherwise the photos remain in the photo library. 4) itdb_photodb_photoalbum_add_photoid (Itdb_PhotoDB *db, Itdb_PhotoAlbum *album, const gint photo_id); should be added. I may have missed some things... I know that this means breaking the API, but I don't think more than one or two applications are using this aspect so far anyway, and this change should be necessary to make libgpod support photos fully. Seb, do you think you could work on this. I will help you out wherever necessary -- just PM. Cheers, JCS. Seb Ruiz wrote: > Okay, here is a new, simpler and better patch. > > On 26/09/06, Jorg Schuler <Jor...@gm...> wrote: >> > Okay, done >> > >> >> and itdb_photodb_rename_photoalbum is not needed any more. Instead >> >> itdb_photodb_photoalbum_by_name() would be useful. >> > >> > How would this new method help renaming the album? >> >> Once you got the photoalbum, just rename it manually (g_free, g_strcpy). >> There aren't any APIs to rename tracks or playlists either. > > Sure, tried and tested - works. > > > >> >> BTW: Can one and the same photo appear in more than one album? That >> >> would require some more functions. >> > >> > Perhaps, but this should go in itdb_photodb_remove_photo, not the >> > methods which I wrote. >> > Deleting an image from an album shouldn't necessarily remove it from >> all albums. > > photodb_remove_photo currently removes all instances of that photo in > the photodb. This makes sense when calling the function directly, but > not when deleting an album. Perhaps we need to think about changing > the way this works. I haven't touched it, but it should be very easy > to do so. > >> >>> + * itdb_photodb_remove_photoalbum >> >> column missing. > > Ah, hehe, i think you mean a colon. > > The other changes to the patch: > - reduction of code > - added more docs to other methods > - photodb_remove_* methods return void, not bool (there was no error > handling anyhow) > - removed photodb_photoalbum_renamed as requested > - added photodb_photoalbum_by_name to return an Itdb_PhotoAlbum > > Hope that makes you happy, > Seb |
From: Thomas Klein-H. <ro...@gm...> - 2006-09-26 10:30:53
|
Hi once again, does this mean, gtkpod actually has phtoto album support? Where can I find it? thanks, Thomas 2006/9/26, Jorg Schuler <Jor...@gm...>: > > > Okay, done > > > >> and itdb_photodb_rename_photoalbum is not needed any more. Instead > >> itdb_photodb_photoalbum_by_name() would be useful. > > > > How would this new method help renaming the album? > > Once you got the photoalbum, just rename it manually (g_free, g_strcpy). > There aren't any APIs to rename tracks or playlists either. > > >> BTW: Can one and the same photo appear in more than one album? That > >> would require some more functions. > > > > Perhaps, but this should go in itdb_photodb_remove_photo, not the > > methods which I wrote. > > Deleting an image from an album shouldn't necessarily remove it from al= l > albums. > > As I said -- if yes, we should add functions to handle this. And since > you are working on it... > > >>> + * itdb_photodb_remove_photoalbum > >> column missing. > > > > What do you mean a column is missing? > > Like this: > > * itdb_photodb_remove_photoalbum: > > Cheers, > > > JCS. > > > ------------------------------------------------------------------------- > Take Surveys. Earn Cash. Influence the Future of IT > Join SourceForge.net's Techsay panel and you'll get the chance to share > your > opinions on IT & business topics through brief surveys -- and earn cash > http://www.techsay.com/default.php?page=3Djoin.php&p=3Dsourceforge&CID=3D= DEVDEV > _______________________________________________ > Gtkpod-devel mailing list > Gtk...@li... > https://lists.sourceforge.net/lists/listinfo/gtkpod-devel > --=20 Thomas Klein-Hitpa=DF Schenkingstra=DFe 16 48301 Nottuln-Schapdetten Germany http://schlurzkuss.de |
From: Jorg S. <Jor...@gm...> - 2006-09-26 11:55:46
|
Hi Thomas, no -- it means that libgpod is getting photo album support. Seb's super-secret application seems to take advantage of this already (Seb: why don't you post a link?) and maybe other applications will pick up. Cheers, JCS. Thomas Klein-Hitpass wrote: > Hi once again, > > does this mean, gtkpod actually has phtoto album support? > Where can I find it? > thanks, > Thomas > > 2006/9/26, Jorg Schuler < Jor...@gm... <mailto:Jor...@gm...>>: > > > Okay, done > > > >> and itdb_photodb_rename_photoalbum is not needed any more. Instead > >> itdb_photodb_photoalbum_by_name() would be useful. > > > > How would this new method help renaming the album? > > Once you got the photoalbum, just rename it manually (g_free, g_strcpy). > There aren't any APIs to rename tracks or playlists either. > > >> BTW: Can one and the same photo appear in more than one album? That > >> would require some more functions. > > > > Perhaps, but this should go in itdb_photodb_remove_photo, not the > > methods which I wrote. > > Deleting an image from an album shouldn't necessarily remove it > from all albums. > > As I said -- if yes, we should add functions to handle this. And since > you are working on it... > > >>> + * itdb_photodb_remove_photoalbum > >> column missing. > > > > What do you mean a column is missing? > > Like this: > > * itdb_photodb_remove_photoalbum: > > Cheers, > > > JCS. |
From: Rommel G C. <ses...@ya...> - 2006-09-26 12:09:41
|
Hope Seb doesn't mind me posting this: http://amarok.kde.org/blog/archives/255-Exporting-photos-to-your-iPod.html - mela Jorg Schuler <Jor...@gm...> wrote: Hi Thomas, no -- it means that libgpod is getting photo album support. Seb's super-secret application seems to take advantage of this already (Seb: why don't you post a link?) and maybe other applications will pick up. Cheers, JCS. --------------------------------- How low will we go? Check out Yahoo! Messengers low PC-to-Phone call rates. |
From: Seb R. <me...@se...> - 2006-09-26 15:38:03
|
Nope, I don't mind at all. The "real" blog post can be found here: http://www.sebruiz.net/167 but that is of no consequence. It stands at the moment as a plugin for the KDE image programs, but asap I would like to wrap it as a standalone application (with the next libgpod release hopefully). Here is an updated screenshot of the app: http://www.sebruiz.net/files/ipod_photo.png Oh yeah, I also need an app name if anybody has ideas :) Seb On 26/09/06, Rommel G Custodio <ses...@ya...> wrote: > Hope Seb doesn't mind me posting this: > http://amarok.kde.org/blog/archives/255-Exporting-photos-to-your-iPod.html > > - mela > > > Jorg Schuler <Jor...@gm...> wrote: > Hi Thomas, > > no -- it means that libgpod is getting photo album support. Seb's > super-secret application seems to take advantage of this already (Seb: > why don't you post a link?) and maybe other applications will pick up. > > Cheers, > > > JCS. > > > ________________________________ > How low will we go? Check out Yahoo! Messenger's low PC-to-Phone call rates. > > > ------------------------------------------------------------------------- > Take Surveys. Earn Cash. Influence the Future of IT > Join SourceForge.net's Techsay panel and you'll get the chance to share your > opinions on IT & business topics through brief surveys -- and earn cash > http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV > > _______________________________________________ > Gtkpod-devel mailing list > Gtk...@li... > https://lists.sourceforge.net/lists/listinfo/gtkpod-devel > > > -- http://www.sebruiz.net/ |
From: Seb R. <me...@se...> - 2006-10-01 23:21:32
|
Hi Jorg, I agree on all these things that you have said. It gives libgpod a much more robust api for applications to work with. I'll try my best to complete these patches, but i'm very busy atm. Perhaps I'll have some time later today. Thanks, Seb On 02/10/06, Jorg Schuler <Jor...@gm...> wrote: > Hi Seb, > > patch looks good so far I think. Thanks for your work! > > There's one issue I think I've mentioned before. I've looked into how > iTunes organizes photos: you can select different folders and each > folder will show up as a photo album. In addition there will be a photo > library with all photos. In this scenario it is clear that each photo > can only be in one album. > > From the data structures it is evident that the iPod doesn't care in > how many albums a photo shows up -- just in the same way as it doesn't > matter in how many playlists a track shows up. > > iTunes photo handling will be incompatible with libgpod's anyway (you > either use iTunes or libgpod) because the only option with iTunes is to > either sync the iPod with predefined folders or not. > > Therefore I'd like to add the functionality to have photos show up in > several albums. > > We can have libgpod take care of certain things, like making sure that > the "photo library" photo album (simply the first album) is created when > adding the first track. > > I think we have to change some things: > > 1) > gboolean itdb_photodb_add_photo (Itdb_PhotoDB *db, > const gchar *albumname, > const gchar *filename); > to > > gboolean itdb_photodb_add_photo (Itdb_PhotoDB *db, > Itdb_PhotoAlbum *album, > const gchar *filename); > > If @album==NULL, add to first album. If no albums exist, create photo > library album. > > 2) > void itdb_photodb_remove_photo (Itdb_PhotoDB *db, > const gint photo_id ); > > should be changed to > void itdb_photodb_remove_photoid (Itdb_PhotoDB *db, > Itdb_PhotoAlbum *album, > const gint photo_id ); > > If @album==NULL, remove photo_id completely, as is the case now. > Otherwise only remove from the album indicated. Make sure that if @album > is the first album, that it is treated the same as @album==NULL. > > 3) > void itdb_photodb_photoalbum_remove (Itdb_PhotoDB *db, > Itdb_PhotoAlbum *pa ); > > could be extended to > > void itdb_photodb_photoalbum_remove (Itdb_PhotoDB *db, > Itdb_PhotoAlbum *pa, > gboolean remove_pics ); > > Only if @remove_pics is TRUE would itdb_photodb_remove_photoid (db, > NULL, photo_id) be called for every photo in the album. Otherwise the > photos remain in the photo library. > > 4) > itdb_photodb_photoalbum_add_photoid (Itdb_PhotoDB *db, Itdb_PhotoAlbum > *album, const gint photo_id); > > should be added. > > I may have missed some things... I know that this means breaking the > API, but I don't think more than one or two applications are using this > aspect so far anyway, and this change should be necessary to make > libgpod support photos fully. > > Seb, do you think you could work on this. I will help you out wherever > necessary -- just PM. > > Cheers, > > > JCS. > > > Seb Ruiz wrote: > > Okay, here is a new, simpler and better patch. > > > > On 26/09/06, Jorg Schuler <Jor...@gm...> wrote: > >> > Okay, done > >> > > >> >> and itdb_photodb_rename_photoalbum is not needed any more. Instead > >> >> itdb_photodb_photoalbum_by_name() would be useful. > >> > > >> > How would this new method help renaming the album? > >> > >> Once you got the photoalbum, just rename it manually (g_free, g_strcpy). > >> There aren't any APIs to rename tracks or playlists either. > > > > Sure, tried and tested - works. > > > > > > > >> >> BTW: Can one and the same photo appear in more than one album? That > >> >> would require some more functions. > >> > > >> > Perhaps, but this should go in itdb_photodb_remove_photo, not the > >> > methods which I wrote. > >> > Deleting an image from an album shouldn't necessarily remove it from > >> all albums. > > > > photodb_remove_photo currently removes all instances of that photo in > > the photodb. This makes sense when calling the function directly, but > > not when deleting an album. Perhaps we need to think about changing > > the way this works. I haven't touched it, but it should be very easy > > to do so. > > > >> >>> + * itdb_photodb_remove_photoalbum > >> >> column missing. > > > > Ah, hehe, i think you mean a colon. > > > > The other changes to the patch: > > - reduction of code > > - added more docs to other methods > > - photodb_remove_* methods return void, not bool (there was no error > > handling anyhow) > > - removed photodb_photoalbum_renamed as requested > > - added photodb_photoalbum_by_name to return an Itdb_PhotoAlbum > > > > Hope that makes you happy, > > Seb > > > > ? TODO > ? cscope.out > ? gtk-doc.make > ? libgpod-0.4.0.tar.gz > ? bindings/Makefile > ? bindings/Makefile.in > ? bindings/python/Makefile > ? bindings/python/Makefile.in > ? bindings/python/examples/Makefile > ? bindings/python/examples/Makefile.in > ? docs/Makefile > ? docs/Makefile.in > ? docs/reference/Makefile > ? docs/reference/Makefile.in > ? docs/reference/html > ? docs/reference/html-build.stamp > ? docs/reference/html.stamp > ? docs/reference/libgpod-decl-list.txt > ? docs/reference/libgpod-decl.txt > ? docs/reference/libgpod-overrides.txt > ? docs/reference/libgpod-undocumented.txt > ? docs/reference/libgpod-unused.txt > ? docs/reference/libgpod.args > ? docs/reference/libgpod.hierarchy > ? docs/reference/libgpod.interfaces > ? docs/reference/libgpod.prerequisites > ? docs/reference/libgpod.signals > ? docs/reference/scan-build.stamp > ? docs/reference/sgml-build.stamp > ? docs/reference/sgml.stamp > ? docs/reference/tmpl-build.stamp > ? docs/reference/tmpl.stamp > ? docs/reference/version.xml > ? docs/reference/xml > ? m4/Makefile > ? m4/Makefile.in > ? m4/gtk-doc.m4 > ? m4/intltool.m4 > ? po/stamp-it > ? tests/test-init-ipod > ? tests/test-ls > ? tests/test-photos > Index: src/itdb.h > =================================================================== > RCS file: /cvsroot/gtkpod/libgpod/src/itdb.h,v > retrieving revision 1.45 > diff -u -r1.45 itdb.h > --- src/itdb.h 28 Sep 2006 00:32:50 -0000 1.45 > +++ src/itdb.h 1 Oct 2006 11:35:12 -0000 > @@ -1,6 +1,7 @@ > /* Time-stamp: <2006-09-23 21:25:40 jcs> > | > | Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net> > +| (C) 2006 Seb Ruiz <me...@se...> > | Part of the gtkpod project. > | > | URL: http://www.gtkpod.org/ > @@ -963,8 +964,12 @@ > void itdb_photodb_free (Itdb_PhotoDB *photodb); > gboolean itdb_photodb_write (Itdb_PhotoDB *db, GError **error); > void itdb_photodb_photoalbum_free (Itdb_PhotoAlbum *pa); > -gboolean itdb_photodb_remove_photo (Itdb_PhotoDB *db, > +void itdb_photodb_remove_photo (Itdb_PhotoDB *db, > const gint photo_id ); > +void itdb_photodb_photoalbum_remove (Itdb_PhotoDB *db, > + Itdb_PhotoAlbum *pa ); > +Itdb_PhotoAlbum *itdb_photodb_photoalbum_by_name( Itdb_PhotoDB *db, > + const gchar *album_name ); > > /* itdb_artwork_... */ > Itdb_Artwork *itdb_artwork_new (void); > Index: src/itdb_photoalbum.c > =================================================================== > RCS file: /cvsroot/gtkpod/libgpod/src/itdb_photoalbum.c,v > retrieving revision 1.7 > diff -u -r1.7 itdb_photoalbum.c > --- src/itdb_photoalbum.c 28 Sep 2006 00:32:50 -0000 1.7 > +++ src/itdb_photoalbum.c 1 Oct 2006 11:35:13 -0000 > @@ -337,13 +337,18 @@ > } > > > -gboolean itdb_photodb_remove_photo (Itdb_PhotoDB *db, > +/** > + * itdb_photodb_remove_photo: > + * @db: the #Itdb_PhotoDB to remove the photo from > + * @photo_id: the id of the photo in @db to be removed > + * The photo will be removed from the database, and from any referencing photoalbums > + */ > +void itdb_photodb_remove_photo (Itdb_PhotoDB *db, > const gint photo_id ) > { > - gboolean result = TRUE; > GList *it; > > - g_return_val_if_fail (db, FALSE); > + g_return_if_fail (db); > > /* Remove the photo from the image list */ > for (it = db->photos; it != NULL; it = it->next) { > @@ -364,9 +369,49 @@ > album->members = g_list_remove (album->members, GINT_TO_POINTER(photo_id)); > album->num_images = g_list_length( album->members ); > } > - return result; > } > > +/** > + * itdb_photodb_photoalbum_by_name: > + * @db: the #Itdb_PhotoDB to retrieve the album from > + * @album_name: the name of the photoalbum to get > + * Returns the photoalbum if found, else NULL > + */ > +Itdb_PhotoAlbum *itdb_photodb_photoalbum_by_name (Itdb_PhotoDB *db, const gchar *album_name) > +{ > + return itdb_get_photoalbum( db, album_name ); > +} > + > +/** > + * itdb_photodb_remove_photoalbum: > + * This method will remove all child photos as well > + * @db: the #Itdb_PhotoDB to apply changes to > + * @pa: the album to be removed from the database > + */ > +void itdb_photodb_photoalbum_remove (Itdb_PhotoDB *db, Itdb_PhotoAlbum *pa) > +{ > + GList *it; > + > + g_return_if_fail (db); > + g_return_if_fail (pa); > + > + /* iterate over the photos within that album and remove them from the database */ > + for (it = pa->members; it != NULL; it = it->next ) { > + gint photo_id = GPOINTER_TO_INT(it->data); > + g_print (_("Deleting photo with id: %d\n"), photo_id); > + itdb_photodb_remove_photo (db, photo_id); > + } > + db->photoalbums = g_list_remove (db->photoalbums, pa); > + itdb_photodb_photoalbum_free (pa); > +} > + > +/** > + * itdb_photodb_photoalbum_new: > + * @db: The database to create a new album in > + * @album_name: the name of the new album > + * > + * Return the album which was created > + */ > Itdb_PhotoAlbum *itdb_photodb_photoalbum_new (Itdb_PhotoDB *db, > const gchar *album_name) > { > @@ -419,3 +464,5 @@ > else > return TRUE; > } > + > + > Index: tests/test-photos.c > =================================================================== > RCS file: /cvsroot/gtkpod/libgpod/tests/test-photos.c,v > retrieving revision 1.6 > diff -u -r1.6 test-photos.c > --- tests/test-photos.c 28 Sep 2006 00:32:50 -0000 1.6 > +++ tests/test-photos.c 1 Oct 2006 11:35:14 -0000 > @@ -119,6 +119,12 @@ > g_print (_("\n")); > g_print (_("Usage to dump all photos to <output_dir>:\n")); > g_print (_("%s dump <mountpoint> <output_dir>\n"), argv[0]); > + g_print (_("\n")); > + g_print (_("Usage to delete a photo album:\n")); > + g_print (_("%s delete <mountpoint> <albumname>\n"), argv[0]); > + g_print (_("\n")); > + g_print (_("Usage to rename a photo album:\n")); > + g_print (_("%s rename <mountpoint> <albumname> <new_albumname>\n"), argv[0]); > return 1; > } > setlocale (LC_ALL, ""); > @@ -158,6 +164,50 @@ > dump_albums (db, argv[3]); > itdb_photodb_free (db); > } > + else if (strcmp (argv[1], "delete") == 0) > + { > + db = itdb_photodb_parse (argv[2], &error); > + if (db == NULL) > + { > + if (error) > + { > + g_print (_("Error reading iPod photo database.(%s)\n"), error->message); > + g_error_free (error); > + error = NULL; > + } > + else > + g_print (_("Error reading iPod photo database.\n")); > + > + return 1; > + } > + itdb_photodb_remove_photoalbum( db, argv[3] ); > + g_print (_("Writing to the photo database.\n")); > + itdb_photodb_write (db, &error); > + g_print (_("Freeing the photo database.\n")); > + itdb_photodb_free (db); > + } > + else if (strcmp (argv[1], "rename") == 0) > + { > + db = itdb_photodb_parse (argv[2], &error); > + if (db == NULL) > + { > + if (error) > + { > + g_print (_("Error reading iPod photo database.(%s)\n"), error->message); > + g_error_free (error); > + error = NULL; > + } > + else > + g_print (_("Error reading iPod photo database.\n")); > + > + return 1; > + } > + itdb_photodb_rename_photoalbum( db, argv[3], argv[4] ); > + g_print (_("Writing to the photo database.\n")); > + itdb_photodb_write (db, &error); > + g_print (_("Freeing the photo database.\n")); > + itdb_photodb_free (db); > + } > else > { > db = itdb_photodb_parse (argv[1], &error); > > -- http://www.sebruiz.net/ |
From: Jorg S. <Jor...@gm...> - 2006-10-02 13:04:45
|
Hi Seb, great. Once you've done that part I'll go over the code and do some more changes. I've noticed that instead of using IDs for referencing the numbers, we'd better be of using a pointer to Itdb_Artwork structure. This should make the handling for applications easier. Also notice that right now you can add photos, but you'll never get back a pointer to the photo added. I'll fix that along the way as well. Cheers, JCS. Seb Ruiz wrote: > Hi Jorg, > I agree on all these things that you have said. It gives libgpod a > much more robust api for applications to work with. I'll try my best > to complete these patches, but i'm very busy atm. > > Perhaps I'll have some time later today. > > Thanks, > Seb > > On 02/10/06, Jorg Schuler <Jor...@gm...> wrote: >> Hi Seb, >> >> patch looks good so far I think. Thanks for your work! >> >> There's one issue I think I've mentioned before. I've looked into how >> iTunes organizes photos: you can select different folders and each >> folder will show up as a photo album. In addition there will be a photo >> library with all photos. In this scenario it is clear that each photo >> can only be in one album. >> >> From the data structures it is evident that the iPod doesn't care in >> how many albums a photo shows up -- just in the same way as it doesn't >> matter in how many playlists a track shows up. >> >> iTunes photo handling will be incompatible with libgpod's anyway (you >> either use iTunes or libgpod) because the only option with iTunes is to >> either sync the iPod with predefined folders or not. >> >> Therefore I'd like to add the functionality to have photos show up in >> several albums. >> >> We can have libgpod take care of certain things, like making sure that >> the "photo library" photo album (simply the first album) is created when >> adding the first track. >> >> I think we have to change some things: >> >> 1) >> gboolean itdb_photodb_add_photo (Itdb_PhotoDB *db, >> const gchar *albumname, >> const gchar *filename); >> to >> >> gboolean itdb_photodb_add_photo (Itdb_PhotoDB *db, >> Itdb_PhotoAlbum *album, >> const gchar *filename); >> >> If @album==NULL, add to first album. If no albums exist, create photo >> library album. >> >> 2) >> void itdb_photodb_remove_photo (Itdb_PhotoDB *db, >> const gint photo_id ); >> >> should be changed to >> void itdb_photodb_remove_photoid (Itdb_PhotoDB *db, >> Itdb_PhotoAlbum *album, >> const gint photo_id ); >> >> If @album==NULL, remove photo_id completely, as is the case now. >> Otherwise only remove from the album indicated. Make sure that if @album >> is the first album, that it is treated the same as @album==NULL. >> >> 3) >> void itdb_photodb_photoalbum_remove (Itdb_PhotoDB *db, >> Itdb_PhotoAlbum *pa ); >> >> could be extended to >> >> void itdb_photodb_photoalbum_remove (Itdb_PhotoDB *db, >> Itdb_PhotoAlbum *pa, >> gboolean remove_pics ); >> >> Only if @remove_pics is TRUE would itdb_photodb_remove_photoid (db, >> NULL, photo_id) be called for every photo in the album. Otherwise the >> photos remain in the photo library. >> >> 4) >> itdb_photodb_photoalbum_add_photoid (Itdb_PhotoDB *db, Itdb_PhotoAlbum >> *album, const gint photo_id); >> >> should be added. >> >> I may have missed some things... I know that this means breaking the >> API, but I don't think more than one or two applications are using this >> aspect so far anyway, and this change should be necessary to make >> libgpod support photos fully. >> >> Seb, do you think you could work on this. I will help you out wherever >> necessary -- just PM. >> >> Cheers, >> >> >> JCS. >> >> >> Seb Ruiz wrote: >>> Okay, here is a new, simpler and better patch. >>> >>> On 26/09/06, Jorg Schuler <Jor...@gm...> wrote: >>>>> Okay, done >>>>> >>>>>> and itdb_photodb_rename_photoalbum is not needed any more. Instead >>>>>> itdb_photodb_photoalbum_by_name() would be useful. >>>>> How would this new method help renaming the album? >>>> Once you got the photoalbum, just rename it manually (g_free, g_strcpy). >>>> There aren't any APIs to rename tracks or playlists either. >>> Sure, tried and tested - works. >>> >>> >>> >>>>>> BTW: Can one and the same photo appear in more than one album? That >>>>>> would require some more functions. >>>>> Perhaps, but this should go in itdb_photodb_remove_photo, not the >>>>> methods which I wrote. >>>>> Deleting an image from an album shouldn't necessarily remove it from >>>> all albums. >>> photodb_remove_photo currently removes all instances of that photo in >>> the photodb. This makes sense when calling the function directly, but >>> not when deleting an album. Perhaps we need to think about changing >>> the way this works. I haven't touched it, but it should be very easy >>> to do so. >>> >>>>>>> + * itdb_photodb_remove_photoalbum >>>>>> column missing. >>> Ah, hehe, i think you mean a colon. >>> >>> The other changes to the patch: >>> - reduction of code >>> - added more docs to other methods >>> - photodb_remove_* methods return void, not bool (there was no error >>> handling anyhow) >>> - removed photodb_photoalbum_renamed as requested >>> - added photodb_photoalbum_by_name to return an Itdb_PhotoAlbum >>> >>> Hope that makes you happy, >>> Seb |
From: Jorg S. <Jor...@gm...> - 2006-10-22 11:27:53
Attachments:
gtkpod-photoalbum_V1.diff
|
OK everyone, Seb and I have been working on a new interface for photosupport. That's what we've come up with so far. It doesn't leave much of the old preliminary interface but should be much easier to use. I've tested adding photos but not removing. Interface in a nutshell: itdb_photodb_parse(): Read an existing PhotoDB. itdb_photodb_create(): Create a new Itdb_PhotoDB structure. The Photo Library Album is (first album) is created automatically. itdb_photodb_add_photo(), itdb_photodb_add_photo_from_data(): Add a photo to the PhotoDB (from file or from a chunk of memory). It is automatically added to the Photo Library Album (first album), which is created if it does not exist already. itdb_photodb_photoalbum_craete(): Create and add a new photoalbum. itdb_photodb_photoalbum_add_photo(): Add a photo (Itdb_Artwork) to an existing photoalbum. itdb_photodb_photoalbum_remove(): Remove an existing photoalbum. Pictures can be kept in the Photo Library or automatically removed as well. itdb_photodb_remove_photo(): Remove a photo either from a photoalbum or completely from the database. itdb_photodb_write(): Write out your PhotoDB. itdb_photodb_free(): Free all memory taken by the PhotoDB. itdb_photodb_photoalbum_by_name(): Find the first photoalbum with a given name. Comments requested! Cheers, JCS. |
From: Seb R. <me...@se...> - 2006-10-30 22:09:27
|
How wonderfully excellent! I've just finished my thesis, so I'm beginning to work some more on my application, which I really hope to release soon! Jorg, do you have any eta date for a 0.4.1 release, with the new photo support? Because of the drastic API changes, it won't be possible to special case functionality for those users on 0.4.0. Cheers, Seb On 22/10/06, Jorg Schuler <Jor...@gm...> wrote: > OK everyone, > > Seb and I have been working on a new interface for photosupport. That's > what we've come up with so far. It doesn't leave much of the old > preliminary interface but should be much easier to use. > > I've tested adding photos but not removing. > > Interface in a nutshell: > > itdb_photodb_parse(): > Read an existing PhotoDB. > > itdb_photodb_create(): > Create a new Itdb_PhotoDB structure. The Photo Library Album is > (first album) is created automatically. > > itdb_photodb_add_photo(), itdb_photodb_add_photo_from_data(): > Add a photo to the PhotoDB (from file or from a chunk of > memory). It is automatically added to the Photo Library Album > (first album), which is created if it does not exist already. > > itdb_photodb_photoalbum_craete(): > Create and add a new photoalbum. > > itdb_photodb_photoalbum_add_photo(): > Add a photo (Itdb_Artwork) to an existing photoalbum. > > itdb_photodb_photoalbum_remove(): > Remove an existing photoalbum. Pictures can be kept in the > Photo Library or automatically removed as well. > > itdb_photodb_remove_photo(): > Remove a photo either from a photoalbum or completely from the > database. > > itdb_photodb_write(): > Write out your PhotoDB. > > itdb_photodb_free(): > Free all memory taken by the PhotoDB. > > itdb_photodb_photoalbum_by_name(): > Find the first photoalbum with a given name. > > Comments requested! > > > Cheers, > > > JCS. > > > Index: ChangeLog > =================================================================== > RCS file: /cvsroot/gtkpod/libgpod/ChangeLog,v > retrieving revision 1.150 > diff -u -r1.150 ChangeLog > --- ChangeLog 22 Oct 2006 08:42:49 -0000 1.150 > +++ ChangeLog 22 Oct 2006 11:22:45 -0000 > @@ -1,5 +1,55 @@ > 2006-10-02 Jorg Schuler <jcsjcs at users.sourceforge.net> > > + First phase of major rework of picture support. > + > + * src/db-artwork-parser.c, src/db-artwork-writer.c, src/itdb.h, > + src/db-itunes-parser.h: renamed 'master' to 'album_type' in > + MhbaHeader and Itdb_PhotoAlbum. > + > + * src/db-artwork-parser.c, src/db-artwork-writer.c, > + src/itdb_photoalbum.c: Itdb_Photoalbum->members are now pointers > + to the corresponding Itdb_Artwork instead of image_ids. > + > + * src/itdb_photoalbum.c: album_ids and image_ids are set just > + before writing the PhotoDB in itdb_photodb_write(). > + > + * src/itdb_photoalbum.c: new interface, basically use as follows: > + > + itdb_photodb_parse(): > + Read an existing PhotoDB. > + > + itdb_photodb_create(): > + Create a new Itdb_PhotoDB structure. The Photo Library Album is > + (first album) is created automatically. > + > + itdb_photodb_add_photo(), itdb_photodb_add_photo_from_data(): > + Add a photo to the PhotoDB (from file or from a chunk of > + memory). It is automatically added to the Photo Library Album > + (first album), which is created if it does not exist already. > + > + itdb_photodb_photoalbum_craete(): > + Create and add a new photoalbum. > + > + itdb_photodb_photoalbum_add_photo(): > + Add a photo (Itdb_Artwork) to an existing photoalbum. > + > + itdb_photodb_photoalbum_remove(): > + Remove an existing photoalbum. Pictures can be kept in the > + Photo Library or automatically removed as well. > + > + itdb_photodb_remove_photo(): > + Remove a photo either from a photoalbum or completely from the > + database. > + > + itdb_photodb_write(): > + Write out your PhotoDB. > + > + itdb_photodb_free(): > + Free all memory taken by the PhotoDB. > + > + itdb_photodb_photoalbum_by_name(): > + Find the first photoalbum with a given name. > + > * src/itdb_playlist.c (itdb_playlist_add, itdb_playlist_add_track): > src/itdb_track.c (itdb_track_add): simplify code by using > g_list_insert(). > Index: src/db-artwork-parser.c > =================================================================== > RCS file: /cvsroot/gtkpod/libgpod/src/db-artwork-parser.c,v > retrieving revision 1.22 > diff -u -r1.22 db-artwork-parser.c > --- src/db-artwork-parser.c 4 Jun 2006 16:24:44 -0000 1.22 > +++ src/db-artwork-parser.c 22 Oct 2006 11:22:45 -0000 > @@ -79,7 +79,7 @@ > parse_mhia (DBParseContext *ctx, Itdb_PhotoAlbum *photo_album, GError *error) > { > MhiaHeader *mhia; > - gint image_id; > + guint32 image_id; > > mhia = db_parse_context_get_m_header (ctx, MhiaHeader, "mhia"); > if (mhia == NULL) { > @@ -88,7 +88,7 @@ > dump_mhia (mhia); > image_id = get_gint32 (mhia->image_id, ctx->byte_order); > photo_album->members = g_list_append (photo_album->members, > - GINT_TO_POINTER(image_id)); > + GUINT_TO_POINTER(image_id)); > db_parse_context_set_total_len (ctx, > get_gint32_db (ctx->db, mhia->total_len)); > return 0; > @@ -402,7 +402,7 @@ > photo_album = g_new0 (Itdb_PhotoAlbum, 1); > photo_album->num_images = get_gint32( mhba->num_mhias, ctx->byte_order); > photo_album->album_id = get_gint32( mhba->playlist_id, ctx->byte_order); > - photo_album->master = get_gint32( mhba->master, ctx->byte_order); > + photo_album->album_type = get_gint32( mhba->album_type, ctx->byte_order); > photo_album->prev_album_id = get_gint32( mhba->prev_playlist_id, ctx->byte_order); > > cur_offset = ctx->header_len; > @@ -766,6 +766,9 @@ > char *filename; > Itdb_DB db; > > + GList *gl; > + GHashTable *hash; > + > db.db.photodb = photodb; > db.db_type = DB_TYPE_PHOTO; > > @@ -784,6 +787,35 @@ > parse_mhfd (ctx, NULL); > db_parse_context_destroy (ctx, TRUE); > > + /* Now we need to replace references to artwork_ids in the > + * photo albums with references to the actual artwork > + * structure. Since we cannot guarantee that the list with the > + * photos is read before the album list, we cannot safely do > + * this at the time of reading the ids. */ > + > + /* Create a hash for faster lookup */ > + hash = g_hash_table_new (g_int_hash, g_int_equal); > + for (gl=photodb->photos; gl; gl=gl->next) > + { > + Itdb_Artwork *photo = gl->data; > + g_return_val_if_fail (photo, -1); > + g_hash_table_insert (hash, &photo->id, photo); > +/* printf ("id: %d, photo: %p\n", photo->id, photo);*/ > + } > + for (gl=photodb->photoalbums; gl; gl=gl->next) > + { > + GList *glp; > + Itdb_PhotoAlbum *album = gl->data; > + g_return_val_if_fail (album, -1); > + for (glp=album->members; glp; glp=glp->next) > + { > + guint image_id = GPOINTER_TO_UINT (glp->data); > + Itdb_Artwork *photo = g_hash_table_lookup (hash, &image_id); > +/* printf ("id: %d, photo: %p\n", image_id, photo);*/ > + glp->data = photo; > + } > + } > + g_hash_table_destroy (hash); > return 0; > } > > Index: src/db-artwork-writer.c > =================================================================== > RCS file: /cvsroot/gtkpod/libgpod/src/db-artwork-writer.c,v > retrieving revision 1.22 > diff -u -r1.22 db-artwork-writer.c > --- src/db-artwork-writer.c 18 Aug 2006 01:47:42 -0000 1.22 > +++ src/db-artwork-writer.c 22 Oct 2006 11:22:46 -0000 > @@ -685,7 +685,7 @@ > } > mhba->num_mhods = get_gint32(1, buffer->byte_order); > mhba->playlist_id = get_gint32(photo_album->album_id, buffer->byte_order); > - mhba->master = get_gint32(photo_album->master, buffer->byte_order); > + mhba->album_type = get_gint32(photo_album->album_type, buffer->byte_order); > mhba->prev_playlist_id = get_gint32(photo_album->prev_album_id, buffer->byte_order); > mhba->num_mhias = get_gint32(photo_album->num_images, buffer->byte_order); > total_bytes = get_gint32 (mhba->header_len, buffer->byte_order); > @@ -704,13 +704,14 @@ > total_bytes += bytes_written; > > for (it = photo_album->members; it != NULL; it = it->next) { > - gint image_id = GPOINTER_TO_INT(it->data); > + Itdb_Artwork *photo = it->data; > + g_return_val_if_fail (photo, -1); > > sub_buffer = ipod_buffer_get_sub_buffer (buffer, total_bytes); > if (sub_buffer == NULL) { > return -1; > } > - bytes_written = write_mhia (image_id, sub_buffer); > + bytes_written = write_mhia (photo->id, sub_buffer); > ipod_buffer_destroy (sub_buffer); > if (bytes_written == -1) { > return -1; > Index: src/db-itunes-parser.h > =================================================================== > RCS file: /cvsroot/gtkpod/libgpod/src/db-itunes-parser.h,v > retrieving revision 1.6 > diff -u -r1.6 db-itunes-parser.h > --- src/db-itunes-parser.h 30 May 2006 14:09:43 -0000 1.6 > +++ src/db-itunes-parser.h 22 Oct 2006 11:22:46 -0000 > @@ -617,7 +617,7 @@ > gint32 playlist_id; /* starts out at $64 and increments by 1 */ > gint32 unknown2; /* unknown, seems to be always 0 */ > gint16 unknown3; /* unknown, seems to be always 0 */ > - gchar master; > + gchar album_type; > /* FIXME: not sure if I have these right; iPod doesn't seem to listen to them */ > guint8 playmusic; > guint8 repeat; > @@ -656,7 +656,7 @@ > gint32 total_len; /* probably the size of the header and all child records; > * as there aren't any child records this is equal to header length */ > gint32 unknown1; /* seems to be zero */ > - gint32 image_id; /* the id of the mhii record this mhia refers to */ > + guint32 image_id; /* the id of the mhii record this mhia refers to */ > unsigned char padding[]; > }; > > Index: src/itdb.h > =================================================================== > RCS file: /cvsroot/gtkpod/libgpod/src/itdb.h,v > retrieving revision 1.45 > diff -u -r1.45 itdb.h > --- src/itdb.h 28 Sep 2006 00:32:50 -0000 1.45 > +++ src/itdb.h 22 Oct 2006 11:22:47 -0000 > @@ -1,4 +1,4 @@ > -/* Time-stamp: <2006-09-23 21:25:40 jcs> > +/* Time-stamp: <2006-10-22 20:19:28 jcs> > | > | Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net> > | Part of the gtkpod project. > @@ -70,74 +70,6 @@ > > /* ------------------------------------------------------------ *\ > * > - * Thumbnail-relevant definitions > - * > -\* ------------------------------------------------------------ */ > - > -/* Types of thumbnails in Itdb_Image */ > -typedef enum { > - ITDB_THUMB_COVER_SMALL, > - ITDB_THUMB_COVER_LARGE, > - ITDB_THUMB_PHOTO_SMALL, > - ITDB_THUMB_PHOTO_LARGE, > - ITDB_THUMB_PHOTO_FULL_SCREEN, > - ITDB_THUMB_PHOTO_TV_SCREEN > -} ItdbThumbType; > - > - > -/* The Itdb_Thumb structure can represent two slightly different > - thumbnails: > - > - a) a thumbnail before it's transferred to the iPod. > - > - offset and size are 0 > - > - width and height, if unequal 0, will indicate the size on the > - iPod. width and height are set the first time a pixbuf is > - requested for this thumbnail. > - > - type is set according to the type this thumbnail represents > - > - filename point to a 'real' image file OR image_data and > - image_data_len are set. > - > - b) a thumbnail (big or small) stored on a database in the iPod. In > - these cases, id corresponds to the ID originally used in the > - database, filename points to a .ithmb file on the iPod > - */ > -struct _Itdb_Thumb { > - ItdbThumbType type; > - gchar *filename; > - guchar *image_data; /* holds the thumbnail data of > - non-transfered thumbnails when > - filename == NULL */ > - gsize image_data_len; /* length of data */ > - guint32 offset; > - guint32 size; > - gint16 width; > - gint16 height; > - gint16 horizontal_padding; > - gint16 vertical_padding; > -}; > - > -struct _Itdb_Artwork { > - GList *thumbnails; /* list of Itdb_Thumbs */ > - guint32 artwork_size; /* Size in bytes of the original source image */ > - guint32 id; /* Artwork id used by photoalbums, starts at > - * 0x40... libgpod will set this on sync. */ > - gint32 creation_date; /* Date the image was created */ > - /* below is for use by application */ > - guint64 usertype; > - gpointer userdata; > - /* function called to duplicate userdata */ > - ItdbUserDataDuplicateFunc userdata_duplicate; > - /* function called to free userdata */ > - ItdbUserDataDestroyFunc userdata_destroy; > -}; > - > - > -/* ------------------------------------------------------------ *\ > - * > * iPod model-relevant definitions > * > \* ------------------------------------------------------------ */ > @@ -459,17 +391,79 @@ > > /* ------------------------------------------------------------ *\ > * > - * iTunesDB, Playlists, Tracks > + * iTunesDB, Playlists, Tracks, PhotoDB, Artwork, Thumbnails > * > \* ------------------------------------------------------------ */ > > /* one star is how much (track->rating) */ > #define ITDB_RATING_STEP 20 > > +/* Types of thumbnails in Itdb_Image */ > +typedef enum { > + ITDB_THUMB_COVER_SMALL, > + ITDB_THUMB_COVER_LARGE, > + ITDB_THUMB_PHOTO_SMALL, > + ITDB_THUMB_PHOTO_LARGE, > + ITDB_THUMB_PHOTO_FULL_SCREEN, > + ITDB_THUMB_PHOTO_TV_SCREEN > +} ItdbThumbType; > + > + > +/* The Itdb_Thumb structure can represent two slightly different > + thumbnails: > + > + a) a thumbnail before it's transferred to the iPod. > + > + offset and size are 0 > + > + width and height, if unequal 0, will indicate the size on the > + iPod. width and height are set the first time a pixbuf is > + requested for this thumbnail. > + > + type is set according to the type this thumbnail represents > + > + filename point to a 'real' image file OR image_data and > + image_data_len are set. > + > + b) a thumbnail (big or small) stored on a database in the iPod. In > + these cases, id corresponds to the ID originally used in the > + database, filename points to a .ithmb file on the iPod > + */ > +struct _Itdb_Thumb { > + ItdbThumbType type; > + gchar *filename; > + guchar *image_data; /* holds the thumbnail data of > + non-transfered thumbnails when > + filename == NULL */ > + gsize image_data_len; /* length of data */ > + guint32 offset; > + guint32 size; > + gint16 width; > + gint16 height; > + gint16 horizontal_padding; > + gint16 vertical_padding; > +}; > + > +struct _Itdb_Artwork { > + GList *thumbnails; /* list of Itdb_Thumbs */ > + guint32 artwork_size; /* Size in bytes of the original source image */ > + guint32 id; /* Artwork id used by photoalbums, starts at > + * 0x40... libgpod will set this on sync. */ > + gint32 creation_date; /* Date the image was created */ > + /* below is for use by application */ > + guint64 usertype; > + gpointer userdata; > + /* function called to duplicate userdata */ > + ItdbUserDataDuplicateFunc userdata_duplicate; > + /* function called to free userdata */ > + ItdbUserDataDestroyFunc userdata_destroy; > +}; > + > + > struct _Itdb_PhotoDB > { > - GList *photos; > - GList *photoalbums; > + GList *photos; /* (Itdb_Artwork *) */ > + GList *photoalbums; /* (Itdb_PhotoAlbum *) */ > Itdb_Device *device;/* iPod device info */ > /* below is for use by application */ > guint64 usertype; > @@ -500,11 +494,13 @@ > struct _Itdb_PhotoAlbum > { > gchar *name; /* name of photoalbum in UTF8 */ > - GList *members; /* photos in album (Track *) */ > + GList *members; /* photos in album (Itdb_Artwork *) */ > gint num_images; /* number of photos in album */ > - gint master; /* 0x01 for master, 0x00 otherwise */ > - gint album_id; > - gint prev_album_id; > + gint album_type; /* 0x01 for master (Photo Library), > + 0x02 otherwise */ > + /* set automatically at time of writing the PhotoDB */ > + gint32 album_id; > + gint32 prev_album_id; > /* below is for use by application */ > guint64 usertype; > gpointer userdata; > @@ -732,7 +728,7 @@ > 0x000c, AAC songs are always 0x0033, Audible > files are 0x0029, WAV files are 0x0. itdb > will attempt to set this value when adding a > - track. */ > + track. */ > guint16 unk146; /* unknown, but appears to be 1 if played at > least once in iTunes and 0 otherwise. */ > guint32 unk148; /* unknown - used for Apple Store DRM songs > @@ -950,21 +946,29 @@ > > /* photoalbum functions */ > Itdb_PhotoDB *itdb_photodb_parse (const gchar *mp, GError **error); > -gboolean itdb_photodb_add_photo (Itdb_PhotoDB *db, > - const gchar *albumname, > - const gchar *filename); > -gboolean itdb_photodb_add_photo_from_data (Itdb_PhotoDB *db, > - const gchar *albumname, > - const guchar *image_data, > - gsize image_data_len); > -Itdb_PhotoAlbum *itdb_photodb_photoalbum_new (Itdb_PhotoDB *db, > - const gchar *album_name); > -Itdb_PhotoDB *itdb_photodb_new (void); > +Itdb_Artwork *itdb_photodb_add_photo (Itdb_PhotoDB *db, const gchar *filename, > + GError **error); > +Itdb_Artwork *itdb_photodb_add_photo_from_data (Itdb_PhotoDB *db, > + const guchar *image_data, > + gsize image_data_len, > + GError **error); > +void itdb_photodb_photoalbum_add_photo (Itdb_PhotoDB *db, > + Itdb_PhotoAlbum *album, > + Itdb_Artwork *photo); > +Itdb_PhotoAlbum *itdb_photodb_photoalbum_create (Itdb_PhotoDB *db, > + const gchar *albumname, > + gint pos); > +Itdb_PhotoDB *itdb_photodb_create (const gchar *mountpoint); > void itdb_photodb_free (Itdb_PhotoDB *photodb); > gboolean itdb_photodb_write (Itdb_PhotoDB *db, GError **error); > -void itdb_photodb_photoalbum_free (Itdb_PhotoAlbum *pa); > -gboolean itdb_photodb_remove_photo (Itdb_PhotoDB *db, > - const gint photo_id ); > +void itdb_photodb_remove_photo (Itdb_PhotoDB *db, > + Itdb_PhotoAlbum *album, > + Itdb_Artwork *photo); > +void itdb_photodb_photoalbum_remove (Itdb_PhotoDB *db, > + Itdb_PhotoAlbum *album, > + gboolean remove_pics); > +Itdb_PhotoAlbum *itdb_photodb_photoalbum_by_name(Itdb_PhotoDB *db, > + const gchar *albumname ); > > /* itdb_artwork_... */ > Itdb_Artwork *itdb_artwork_new (void); > Index: src/itdb_photoalbum.c > =================================================================== > RCS file: /cvsroot/gtkpod/libgpod/src/itdb_photoalbum.c,v > retrieving revision 1.7 > diff -u -r1.7 itdb_photoalbum.c > --- src/itdb_photoalbum.c 28 Sep 2006 00:32:50 -0000 1.7 > +++ src/itdb_photoalbum.c 22 Oct 2006 11:22:47 -0000 > @@ -1,3 +1,31 @@ > +/* Time-stamp: <2006-10-22 20:19:45 jcs> > +| > +| Copyright (C) 2002-2006 Jorg Schuler <jcsjcs at users sourceforge net> > +| Part of the gtkpod project. > +| > +| URL: http://www.gtkpod.org/ > +| URL: http://gtkpod.sourceforge.net/ > +| > +| The code contained in this file is free software; you can redistribute > +| it and/or modify it under the terms of the GNU Lesser General Public > +| License as published by the Free Software Foundation; either version > +| 2.1 of the License, or (at your option) any later version. > +| > +| This file is distributed in the hope that it will be useful, > +| but WITHOUT ANY WARRANTY; without even the implied warranty of > +| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > +| Lesser General Public License for more details. > +| > +| You should have received a copy of the GNU Lesser General Public > +| License along with this code; if not, write to the Free Software > +| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > +| > +| iTunes and iPod are trademarks of Apple > +| > +| This product is not supported/written/published by Apple! > +| > +| $Id: itdb_artwork.c,v 1.15 2006/09/17 17:27:21 jcsjcs Exp $ > +*/ > #include <config.h> > > #include "itdb_private.h" > @@ -9,6 +37,59 @@ > #include <glib/gi18n-lib.h> > > > +/* Short summary: > + > + itdb_photodb_parse(): > + Read an existing PhotoDB. > + > + itdb_photodb_create(): > + Create a new Itdb_PhotoDB structure. The Photo Library Album is > + (first album) is created automatically. > + > + itdb_photodb_add_photo(), itdb_photodb_add_photo_from_data(): > + Add a photo to the PhotoDB (from file or from a chunk of > + memory). It is automatically added to the Photo Library Album > + (first album), which is created if it does not exist already. > + > + itdb_photodb_photoalbum_craete(): > + Create and add a new photoalbum. > + > + itdb_photodb_photoalbum_add_photo(): > + Add a photo (Itdb_Artwork) to an existing photoalbum. > + > + itdb_photodb_photoalbum_remove(): > + Remove an existing photoalbum. Pictures can be kept in the > + Photo Library or automatically removed as well. > + > + itdb_photodb_remove_photo(): > + Remove a photo either from a photoalbum or completely from the database. > + > + itdb_photodb_write(): > + Write out your PhotoDB. > + > + itdb_photodb_free(): > + Free all memory taken by the PhotoDB. > + > + itdb_photodb_photoalbum_by_name(): > + Find the first photoalbum with a given name. > + > + > + If you cannot add photos because your iPod is not recognized, you > + may have to set the iPod model by calling > + > + itdb_device_set_sysinfo (db->device, "ModelNumStr", model); > + > + For example, "MA450" would stand for an 80 GB 6th generation iPod > + Video. See itdb_device.c for a list of supported models. > + > + This information will be written to the iPod when the PhotoDB is > + saved (itdb_device_write_sysinfo() is called). > +*/ > + > + > +static Itdb_PhotoDB *itdb_photodb_new (void); > +static void itdb_photodb_photoalbum_free (Itdb_PhotoAlbum *pa); > + > /* Set @error with standard error message */ > static void error_no_photos_dir (const gchar *mp, GError **error) > { > @@ -146,14 +227,36 @@ > > > /** > - * itdb_photodb_new: > + * itdb_photodb_create: > + * > + * @mountpoint: mountpoint or NULL. > * > - * Creates a new Itdb_PhotoDB > + * Creates a new Itdb_PhotoDB. If mountpoint is NULL, you will have to > + * set it manually later by calling itdb_device_set_mountpoint(). > * > * Return value: a newly created Itdb_PhotoDB to be freed with > - * itdb_photodb_free() when it's no longer needed > + * itdb_photodb_free() when it's no longer needed. The Photo Library > + * Album is created automatically. > **/ > -Itdb_PhotoDB *itdb_photodb_new (void) > +Itdb_PhotoDB *itdb_photodb_create (const gchar *mountpoint) > +{ > + Itdb_PhotoDB *photodb = itdb_photodb_new (); > + Itdb_PhotoAlbum *album; > + > + album = itdb_photodb_photoalbum_create (photodb, _("Photo Libarary"), -1); > + album->album_type = 1; /* Photo Library */ > + > + if (mountpoint) > + { > + itdb_device_set_mountpoint (photodb->device, mountpoint); > + } > + > + return photodb; > +} > + > + > + > +static Itdb_PhotoDB *itdb_photodb_new (void) > { > Itdb_PhotoDB *photodb; > > @@ -164,6 +267,7 @@ > } > > > + > /** > * itdb_photodb_free: > * @photodb: an #Itdb_PhotoDB > @@ -207,181 +311,353 @@ > return photo_id + 1; > } > > -static gint itdb_get_free_photoalbum_id ( Itdb_PhotoDB *db ) > +static void itdb_photodb_photoalbum_free (Itdb_PhotoAlbum *album) > { > - gint album_id = 0; > - GList *it; > + if (album) > + { > + g_free (album->name); > + g_list_free (album->members); > > - for (it = db->photoalbums; it != NULL; it = it->next) { > - Itdb_PhotoAlbum *album; > + if (album->userdata && album->userdata_destroy) > + (*album->userdata_destroy) (album->userdata); > > - album = (Itdb_PhotoAlbum *)it->data; > - if( album->album_id > album_id ) > - album_id = album->album_id; > - } > - return album_id + 1; > + g_free (album); > + } > } > > -static Itdb_PhotoAlbum *itdb_get_photoalbum ( Itdb_PhotoDB *db, const gchar *albumname ) > -{ > - GList *it; > > - if( strcmp( albumname, "master" ) == 0 ) > - return g_list_nth_data (db->photoalbums, 0); > +/* called by itdb_photodb_add_photo() and > + itdb_photodb_add_photo_from_data() */ > +static Itdb_Artwork *itdb_photodb_add_photo_internal (Itdb_PhotoDB *db, > + const gchar *filename, > + const guchar *image_data, > + gsize image_data_len, > + GError **error) > +{ > +#ifdef HAVE_GDKPIXBUF > + gboolean result; > + Itdb_Artwork *artwork; > + Itdb_PhotoAlbum *album; > + const Itdb_ArtworkFormat *format; > + > + g_return_val_if_fail (db, NULL); > + g_return_val_if_fail (db->device, NULL); > + g_return_val_if_fail (filename || image_data, NULL); > + g_return_val_if_fail (!(image_data && (image_data_len == 0)), NULL); > > - for (it = db->photoalbums; it != NULL; it = it->next) { > - Itdb_PhotoAlbum *album; > + if (!ipod_supports_photos (db->device)) > + { > + const Itdb_IpodInfo *ipodinfo = itdb_device_get_ipod_info (db->device); > + const gchar *model, *generation; > > - album = (Itdb_PhotoAlbum *)it->data; > - if( strcmp(album->name, albumname) == 0 ) > - return album; > + if (!ipodinfo) > + { > + g_set_error (error, 0, -1, > + _("You need to specify the iPod model used before photos can be added.")); > + return NULL; > + /* For information: The model is set by calling the rather > + unintuitive function itdb_device_set_sysinfo as > + follows: > + > + itdb_device_set_sysinfo (db->device, "ModelNumStr", model); > + > + For example, "MA450" would stand for an 80 GB 6th > + generation iPod Video. See itdb_device.c for a list of > + supported models. > + > + This information will be written to the iPod when the > + PhotoDB is saved (itdb_device_write_sysinfo() is called). > + */ > } > - return (Itdb_PhotoAlbum *)NULL; > -} > > + model = itdb_info_get_ipod_model_name_string (ipodinfo->ipod_model); > + generation = itdb_info_get_ipod_generation_string (ipodinfo->ipod_generation); > + g_return_val_if_fail (model && generation, NULL); > + g_set_error (error, 0, -1, > + _("Your iPod does not seem to support photos. Maybe you need to specify the correct iPod model number? It is currently set to 'x%s' (%s/%s)."), > + ipodinfo->model_number, generation, model); > + return NULL; > + } > > -void itdb_photodb_photoalbum_free (Itdb_PhotoAlbum *pa) > -{ > - if (pa) > + /* check if filename is valid */ > + if (filename) > { > - g_free (pa->name); > - g_list_free (pa->members); > + struct stat statbuf; > + if (g_stat (filename, &statbuf) != 0) > + { > + g_set_error (error, 0, -1, > + _("Could not access file '%s'. Photo not added.")); > + return NULL; > + } > + } > > - if (pa->userdata && pa->userdata_destroy) > - (*pa->userdata_destroy) (pa->userdata); > + artwork = itdb_artwork_new (); > > - g_free (pa); > - } > -} > + /* Add a thumbnail for every supported format */ > + format = itdb_device_get_artwork_formats (db->device); > + g_return_val_if_fail (format, NULL); > > -static gboolean itdb_photodb_add_photo_internal (Itdb_PhotoDB *db, > - const gchar *albumname, > - const gchar *filename, > - const guchar *image_data, > - gsize image_data_len) > -{ > - gboolean result; > - Itdb_Artwork *artwork; > - Itdb_PhotoAlbum *photoalbum; > - const Itdb_ArtworkFormat *format; > - gint photo_id; > - > - g_return_val_if_fail (db, FALSE); > - > - artwork = itdb_artwork_new (); > - > - photo_id = itdb_get_free_photo_id( db ); > - artwork->id = photo_id; > - > - /* Add a thumbnail for every supported format */ > - format = itdb_device_get_artwork_formats(db->device); > - for( result = TRUE; format->type != -1 && result == TRUE; format++) > + for(result = TRUE; format->type != -1 && result == TRUE; format++) > + { > + if((format->type == ITDB_THUMB_COVER_SMALL) || > + (format->type == ITDB_THUMB_COVER_LARGE)) > + continue; > + if (filename) > { > - if((format->type == ITDB_THUMB_COVER_SMALL) || > - (format->type == ITDB_THUMB_COVER_LARGE)) > - continue; > - if (filename) > - { > - result = itdb_artwork_add_thumbnail (artwork, > - format->type, > - filename); > - } > - if (image_data) > - { > - result = itdb_artwork_add_thumbnail_from_data (artwork, > - format->type, > - image_data, > - image_data_len); > - } > + result = itdb_artwork_add_thumbnail (artwork, > + format->type, > + filename); > } > - > - if (result != TRUE) > + if (image_data) > { > - itdb_artwork_remove_thumbnails (artwork); > - return result; > + result = itdb_artwork_add_thumbnail_from_data (artwork, > + format->type, > + image_data, > + image_data_len); > } > - db->photos = g_list_append (db->photos, artwork); > + } > + > + if (result != TRUE) > + { > + itdb_artwork_free (artwork); > + g_set_error (error, 0, -1, > + _("Unexpected error in itdb_photodb_add_photo_internal() while adding photo, please report.")); > + return NULL; > + } > > - photoalbum = itdb_get_photoalbum( db, albumname ); > - if( photoalbum == NULL ) > - photoalbum = itdb_photodb_photoalbum_new( db, albumname ); > - photoalbum->num_images++; > - photoalbum->members = g_list_append (photoalbum->members, GINT_TO_POINTER(photo_id)); > + /* Add artwork to the list of photos */ > + db->photos = g_list_append (db->photos, artwork); > > - return result; > + /* Add artwork to the first playlist */ > + album = itdb_photodb_photoalbum_by_name (db, NULL); > + if (!album) > + { > + album = itdb_photodb_photoalbum_create (db, _("Photo Libarary"), -1); > + album->album_type = 1; /* Photo Library */ > + } > + itdb_photodb_photoalbum_add_photo (db, album, artwork); > + > + return artwork; > +#else > + g_set_error (error, 0, -1, > + _("Library compiled without gkdpixbuf support. Picture support is disabled.")); > + return NULL; > +#endif > } > > > -gboolean itdb_photodb_add_photo (Itdb_PhotoDB *db, > - const gchar *albumname, > - const gchar *filename) > + > +/** > + * itdb_photodb_add_photo: > + * @db: the #Itdb_PhotoDB to add the photo to. > + * @filename: file with the photo to add. > + * @error: return location for a #GError or NULL > + * > + * Add a photo to the PhotoDB. The photo is automatically added to the > + * first Photoalbum, which by default contains a list of all photos in > + * the database. If no Photoalbums exist one is created automatically. > + * > + * Return value: a pointer to the added photo. > + **/ > +Itdb_Artwork *itdb_photodb_add_photo (Itdb_PhotoDB *db, > + const gchar *filename, > + GError **error) > { > g_return_val_if_fail (db, FALSE); > g_return_val_if_fail (filename, FALSE); > > - return itdb_photodb_add_photo_internal (db, albumname, filename, > - NULL, 0); > + return itdb_photodb_add_photo_internal (db, filename, NULL, 0, error); > } > > > -gboolean itdb_photodb_add_photo_from_data (Itdb_PhotoDB *db, > - const gchar *albumname, > - const guchar *image_data, > - gsize image_data_len) > +/** > + * itdb_photodb_add_photo_from_data: > + * @db: the #Itdb_PhotoDB to add the photo to. > + * @filename: file with the photo to add. > + * @error: return location for a #GError or NULL > + * > + * Add a photo to the PhotoDB. The photo is automatically added to the > + * first Photoalbum, which by default contains a list of all photos in > + * the database. If no Photoalbums exist one is created automatically. > + **/ > +Itdb_Artwork *itdb_photodb_add_photo_from_data (Itdb_PhotoDB *db, > + const guchar *image_data, > + gsize image_data_len, > + GError **error) > { > g_return_val_if_fail (db, FALSE); > g_return_val_if_fail (image_data, FALSE); > > - return itdb_photodb_add_photo_internal (db, albumname, NULL, > - image_data, image_data_len); > + return itdb_photodb_add_photo_internal (db, NULL, image_data, image_data_len, > + error); > } > > > -gboolean itdb_photodb_remove_photo (Itdb_PhotoDB *db, > - const gint photo_id ) > +/** > + * itdb_photodb_remove_photo: > + * @db: the #Itdb_PhotoDB to remove the photo from > + * @album: the album to remove the photo from. If album is NULL, then > + * it will first be removed from all photoalbums and then from the > + * photo database as well. > + * @photo: #Itdb_Artwork (photo) to remove. > + * > + * Remove photo. If @album is not the first photoalbum, the photo will > + * be removed from that album only. If @album is NULL or the first > + * photoalbum (Photo Library), the photo will be removed from all > + * albums and the #Itdb_PhotoDB. > + * > + * @photo will be freed and can no longer be used if removed from the > + * first photoalbum. > + */ > +void itdb_photodb_remove_photo (Itdb_PhotoDB *db, > + Itdb_PhotoAlbum *album, > + Itdb_Artwork *photo) > { > - gboolean result = TRUE; > - GList *it; > + GList *it; > > - g_return_val_if_fail (db, FALSE); > + g_return_if_fail (db); > > - /* Remove the photo from the image list */ > - for (it = db->photos; it != NULL; it = it->next) { > - Itdb_Artwork *artwork; > + /* If album==NULL, or album is the master album, remove from all > + * albums */ > + if ((album == NULL) || (album == g_list_nth_data (db->photoalbums, 0))) > + { > + /* Remove the photo from any albums containing it */ > + for (it = db->photoalbums; it != NULL; it = it->next) > + { > + Itdb_PhotoAlbum *_album = it->data; > + while (g_list_find (_album->members, photo)) > + { > + _album->members = g_list_remove (_album->members, photo); > + --_album->num_images; > + } > + } > + /* Remove the photo from the image list */ > + db->photos = g_list_remove (db->photos, photo); > + /* Free the photo */ > + itdb_artwork_free (photo); > + } > + /* If album is specified, only remove it from that album */ > + else > + { > + album->members = g_list_remove (album->members, photo); > + --album->num_images; > + } > +} > > - artwork = (Itdb_Artwork *)it->data; > - if( artwork->id == photo_id ) { > - db->photos = g_list_remove (db->photos, artwork); > - break; > - } > - } > +/** > + * itdb_photodb_photoalbum_by_name: > + * Return a pointer to the first photoalbum named @albumname > + * > + * @db: the #Itdb_PhotoDB to retrieve the album from > + * @albumname: the name of the photoalbum to get or NULL for the > + * master photoalbum. > + * > + * Returns the photoalbum if found, else NULL > + */ > +Itdb_PhotoAlbum *itdb_photodb_photoalbum_by_name (Itdb_PhotoDB *db, const gchar *albumname) > +{ > + GList *it; > + > + if( albumname == NULL ) > + return g_list_nth_data (db->photoalbums, 0); > > - /* Remove the photo from any albums containing it */ > for (it = db->photoalbums; it != NULL; it = it->next) { > Itdb_PhotoAlbum *album; > > album = (Itdb_PhotoAlbum *)it->data; > - album->members = g_list_remove (album->members, GINT_TO_POINTER(photo_id)); > - album->num_images = g_list_length( album->members ); > + if( strcmp(album->name, albumname) == 0 ) > + return album; > } > - return result; > + return NULL; > +} > + > +/** > + * itdb_photodb_remove_photoalbum: > + * @db: the #Itdb_PhotoDB to apply changes to > + * @album: the album to be removed from the database > + * @remove_pics: TRUE to remove pics in that album permanently from > + * the database. > + * > + * Remove @album from the Photo Database. If remove_pics is TRUE, > + * remove all photos contained in @album from the Photo Database. > + * > + * Memory used by the removed album will be freed and the album cannot > + * be accessed any more. > + **/ > +void itdb_photodb_photoalbum_remove (Itdb_PhotoDB *db, > + Itdb_PhotoAlbum *album, > + gboolean remove_pics) > +{ > + GList *it; > + > + g_return_if_fail (db); > + g_return_if_fail (album); > + > + /* if remove_pics, iterate over the photos within that album > + * and remove them from the database */ > + if (remove_pics) > + { > + for (it = album->members; it != NULL; it = it->next ) > + { > + Itdb_Artwork *photo = it->data; > + itdb_photodb_remove_photo (db, NULL, photo); > + } > + } > + db->photoalbums = g_list_remove (db->photoalbums, album); > + itdb_photodb_photoalbum_free (album); > +} > + > +/** > + * itdb_photodb_photoalbum_add_photo: > + * @db: the #Itdb_PhotoDB to act on > + * @album: the #Itdb_PhotoAlbum to add the photo to > + * @photo: a pointer to the photo (#Itdb_Artwork) to add to the album > + * > + * Adds a photo already in the library to the specified album > + * @album. Photos are automatically added to the first album (Photo > + * Library) when calling itdb_photodb_add_photo() or > + * itdb_photodb_add_photo_from_data(), so you don't have to use this > + * function to add them there. > + * > + */ > + > +void itdb_photodb_photoalbum_add_photo (Itdb_PhotoDB *db, > + Itdb_PhotoAlbum *album, > + Itdb_Artwork *photo) > +{ > + g_return_if_fail (db); > + g_return_if_fail (album); > + g_return_if_fail (photo); > + > + album->members = g_list_append (album->members, photo); > + ++album->num_images; > } > > -Itdb_PhotoAlbum *itdb_photodb_photoalbum_new (Itdb_PhotoDB *db, > - const gchar *album_name) > + > +/** > + * itdb_photodb_photoalbum_create: > + * @db: The database to create a new album in > + * @album_name: the name of the new album > + * @pos: position where to insert the newly created album (-1 for > + * append to end). > + * > + * Return value: the album which was created and added. > + */ > +Itdb_PhotoAlbum *itdb_photodb_photoalbum_create (Itdb_PhotoDB *db, > + const gchar *albumname, > + gint pos) > { > - Itdb_PhotoAlbum *photoalbum; > + Itdb_PhotoAlbum *album; > > - g_return_val_if_fail (db, FALSE); > - g_return_val_if_fail (album_name, FALSE); > + g_return_val_if_fail (db, NULL); > + g_return_val_if_fail (albumname, NULL); > > - photoalbum = g_new0 (Itdb_PhotoAlbum, 1); > - photoalbum->album_id = itdb_get_free_photoalbum_id( db ); > - photoalbum->prev_album_id = photoalbum->album_id - 1; > - photoalbum->name = g_strdup( album_name ); > - db->photoalbums = g_list_append (db->photoalbums, photoalbum); > + album = g_new0 (Itdb_PhotoAlbum, 1); > + album->album_type = 2; /* normal album, set to 1 for Photo Library */ > + album->name = g_strdup(albumname); > + db->photoalbums = g_list_insert (db->photoalbums, album, pos); > > - return photoalbum; > + return album; > } > > /** > @@ -398,7 +674,9 @@ > **/ > gboolean itdb_photodb_write (Itdb_PhotoDB *photodb, GError **error) > { > - gboolean result; > + gint result; > + GList *gl; > + gint32 id, prev_id; > > g_return_val_if_fail (photodb, FALSE); > g_return_val_if_fail (photodb->device, FALSE); > @@ -406,12 +684,41 @@ > if (photodb->device->byte_order == 0) > itdb_device_autodetect_endianess (photodb->device); > > + /* set up photo_ids */ > + id = 0x40; > + for (gl=photodb->photos; gl; gl=gl->next) > + { > + Itdb_Artwork *photo = gl->data; > + g_return_val_if_fail (photo, FALSE); > + photo->id = id; > + ++id; > + } > + /* set up album_ids -- this is how my iPod Nano does it... */ > + prev_id = 0x64; > + id = prev_id + g_list_length (photodb->photos); > + for (gl=photodb->photoalbums; gl; gl=gl->next) > + { > + Itdb_PhotoAlbum *album = gl->data; > + g_return_val_if_fail (album, FALSE); > + album->album_id = id; > + album->prev_album_id = prev_id; > + ++id; > + ++prev_id; > + if (gl != photodb->photoalbums) > + { /* except for the first album */ > + prev_id += g_list_length (album->members); > + } > + } > + > result = ipod_write_photo_db (photodb); > > /* Write SysInfo file if it has changed */ > - if (!(*error) && photodb->device->sysinfo_changed) > + if (!error || !(*error)) > { > - itdb_device_write_sysinfo (photodb->device, error); > + if (photodb->device->sysinfo_changed) > + { > + itdb_device_write_sysinfo (photodb->device, error); > + } > } > > if (result == -1) > Index: tests/test-photos.c > =================================================================== > RCS file: /cvsroot/gtkpod/libgpod/tests/test-photos.c,v > retrieving revision 1.6 > diff -u -r1.6 test-photos.c > --- tests/test-photos.c 28 Sep 2006 00:32:50 -0000 1.6 > +++ tests/test-photos.c 22 Oct 2006 11:22:47 -0000 > @@ -69,24 +69,6 @@ > } > > static void > -dump_artwork (Itdb_PhotoDB *db, gint photo_id, > - const gchar *album_name, const gchar *dir) > -{ > - GList *it; > - > - for (it = db->photos; it != NULL; it = it->next) { > - Itdb_Artwork *artwork; > - > - artwork = (Itdb_Artwork *)it->data; > - g_return_if_fail (artwork); > - if( artwork->id == photo_id ) { > - dump_thumbs (db, artwork, album_name, dir); > - break; > - } > - } > -} > - > -static void > dump_albums (Itdb_PhotoDB *db, const gchar *dir) > { > GList *it; > @@ -99,8 +81,8 @@ > g_return_if_fail (album); > > for (it2 = album->members; it2 != NULL; it2 = it2->next) { > - gint photo_id = GPOINTER_TO_INT(it2->data); > - dump_artwork (db, photo_id, album->name, dir); > + Itdb_Artwork *photo = it2->data; > + dump_thumbs (db, photo, album->name, dir); > } > } > } > @@ -115,7 +97,7 @@ > if (argc < 4) { > g_print (_("Usage to add photos:\n")); > g_print (_("%s <mountpoint> <albumname> <filename(s)>\n"), argv[0]); > - g_print (_("albumname should be set to 'master' to add photos to the master photo album\n")); > + g_print (_("albumname should be set to 'NULL' to add photos to the master photo album (Photo Library)\n")); > g_print (_("\n")); > g_print (_("Usage to dump all photos to <output_dir>:\n")); > g_print (_("%s dump <mountpoint> <output_dir>\n"), argv[0]); > @@ -173,12 +155,36 @@ > { > g_print (_("Error reading iPod photo database, will attempt to create a new database\n")); > } > - db = itdb_photodb_new (); > - itdb_device_set_mountpoint (db->device, argv[1]); > + db = itdb_photodb_create (argv[1]); > } > for (i=3; i<argc; ++i) > { > - itdb_photodb_add_photo (db, argv[2], argv[i]); > + Itdb_PhotoAlbum *album; > + Itdb_Artwork *photo; > + > + photo = itdb_photodb_add_photo (db, argv[i], &error); > + if (photo == NULL) > + { > + if (error) > + { > + g_print (_("Error adding photo (%s) to photo database: %s\n"), > + argv[i], error->message); > + g_error_free (error); > + error = NULL; > + } > + } > + else > + { > + if (strcmp (argv[2], "NULL") != 0) > + { > + album = itdb_photodb_photoalbum_by_name (db, argv[2]); > + if (!album) > + { > + album = itdb_photodb_photoalbum_create (db, argv[2], -1); > + } > + itdb_photodb_photoalbum_add_photo (db, album, photo); > + } > + } > } > > itdb_photodb_write (db, NULL); > > ------------------------------------------------------------------------- > Using Tomcat but need to do more? Need to support web services, security? > Get stuff done quickly with pre-integrated technology to make your job easier > Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 > > _______________________________________________ > Gtkpod-devel mailing list > Gtk...@li... > https://lists.sourceforge.net/lists/listinfo/gtkpod-devel > > > -- http://www.sebruiz.net/ |
From: Jorg S. <Jor...@gm...> - 2006-10-31 00:49:31
|
Hi Seb, congratulations for finishing your thesis! I guess a release (0.5.0) could probably be done in about two weeks -- tonight I need to pack for a short vacation trip that starts tomorrow night, then I want to look over the iTunesDB and try to add as many data fields to our data structures (like I've done with Itdb_PhotoAlbum) as possible. That probably also means to change the soname to avoid problems with the package maintainers... Cheers, JCS. Seb Ruiz wrote: > How wonderfully excellent! > > I've just finished my thesis, so I'm beginning to work some more on my > application, which I really hope to release soon! > > Jorg, do you have any eta date for a 0.4.1 release, with the new photo > support? Because of the drastic API changes, it won't be possible to > special case functionality for those users on 0.4.0. > > Cheers, > Seb > > On 22/10/06, Jorg Schuler <Jor...@gm...> wrote: >> OK everyone, >> >> Seb and I have been working on a new interface for photosupport. That's >> what we've come up with so far. It doesn't leave much of the old >> preliminary interface but should be much easier to use. >> >> I've tested adding photos but not removing. >> >> Interface in a nutshell: >> >> itdb_photodb_parse(): >> Read an existing PhotoDB. >> >> itdb_photodb_create(): >> Create a new Itdb_PhotoDB structure. The Photo Library Album is >> (first album) is created automatically. >> >> itdb_photodb_add_photo(), itdb_photodb_add_photo_from_data(): >> Add a photo to the PhotoDB (from file or from a chunk of >> memory). It is automatically added to the Photo Library Album >> (first album), which is created if it does not exist already. >> >> itdb_photodb_photoalbum_craete(): >> Create and add a new photoalbum. >> >> itdb_photodb_photoalbum_add_photo(): >> Add a photo (Itdb_Artwork) to an existing photoalbum. >> >> itdb_photodb_photoalbum_remove(): >> Remove an existing photoalbum. Pictures can be kept in the >> Photo Library or automatically removed as well. >> >> itdb_photodb_remove_photo(): >> Remove a photo either from a photoalbum or completely from the >> database. >> >> itdb_photodb_write(): >> Write out your PhotoDB. >> >> itdb_photodb_free(): >> Free all memory taken by the PhotoDB. >> >> itdb_photodb_photoalbum_by_name(): >> Find the first photoalbum with a given name. >> >> Comments requested! >> >> >> Cheers, >> >> >> JCS. >> >> |