void UploadDialog::ipodItemSelected(QTreeWidgetItem* item) { m_ipodPreview->clear(); if( m_ipodAlbumList->currentItem() ) m_ipodAlbumList->currentItem()->setSelected( true ); // Need a singleshot, else the selected items don't get updated. QTimer::singleShot(0, this, SLOT(enableButtons())); #define item dynamic_cast<IpodPhotoItem*>(item) if( !item ) return; Itdb_Artwork* artwork = item->artwork(); GdkPixbuf* gpixbuf = 0; // First arg in itdb_artwork_get_pixbuf(...) is pointer to Itdb_Device struct, // in kipiplugin-ipodexport it is m_itdb->device. i hope it _is_ initialiezed gpixbuf = (GdkPixbuf*) itdb_artwork_get_pixbuf( m_itdb->device, artwork, -1, -1 ); if( !gpixbuf ) { kDebug() << "no thumb was found" ; return; } #undef item // GdkPixbuf *buf = itdb_thumb_get_gdk_pixbuf( m_itdb->device, thumb ); // int size = 0; // QImage *image = buf->convertToImage(); // kDebug() << "image size: " << image->size() ; // // QPixmap pix; // pix.convertFromImage( image ); // m_ipodPreview->setPixmap( pix ); // memory release gdk_pixbuf_unref ( gpixbuf ); }
/** * Using the given track, set the metadata of the target * file */ void AP_write_metadata(Track *track, const char *filePath, GError **error) { ExtraTrackData *etr; gchar *atom; gchar *value; g_return_if_fail(track); APar_ScanAtoms(filePath); if (metadata_style != ITUNES_STYLE) { gchar *fbuf = charset_to_utf8(filePath); gtkpod_log_error(error, g_strdup_printf(_("ERROR %s is not itunes style."), fbuf)); g_free(fbuf); return; } // Title set_limited_text_atom_value(TITLE, track->title); // Artist set_limited_text_atom_value(ARTIST, track->artist); // Album Artist set_limited_text_atom_value(ALBUM_ARTIST, track->albumartist); // Album set_limited_text_atom_value(ALBUM, track->album); // Genre APar_MetaData_atomGenre_Set(track->genre); // Track Number and Total atom = g_strdup_printf("%s.%s.%s", ILST_FULL_ATOM, TRACK_NUM_AND_TOTAL, DATA); if (track->track_nr == 0) { APar_RemoveAtom(atom, VERSIONED_ATOM, 0); } else { gchar *track_info = g_strdup_printf("%d / %d", track->track_nr, track->tracks); short tracknumData_atom = APar_MetaData_atom_Init(atom, track_info, AtomFlags_Data_Binary); APar_Unified_atom_Put(tracknumData_atom, NULL, UTF8_iTunesStyle_256glyphLimited, 0, 16); APar_Unified_atom_Put(tracknumData_atom, NULL, UTF8_iTunesStyle_256glyphLimited, track->track_nr, 16); APar_Unified_atom_Put(tracknumData_atom, NULL, UTF8_iTunesStyle_256glyphLimited, track->tracks, 16); APar_Unified_atom_Put(tracknumData_atom, NULL, UTF8_iTunesStyle_256glyphLimited, 0, 16); g_free(track_info); } g_free(atom); // Disk Number and Total atom = g_strdup_printf("%s.%s.%s", ILST_FULL_ATOM, DISK_NUM_AND_TOTAL, DATA); if (track->cd_nr == 0) { APar_RemoveAtom(atom, VERSIONED_ATOM, 0); } else { gchar *disk_info = g_strdup_printf("%d / %d", track->cd_nr, track->cds); short disknumData_atom = APar_MetaData_atom_Init(atom, disk_info, AtomFlags_Data_Binary); APar_Unified_atom_Put(disknumData_atom, NULL, UTF8_iTunesStyle_256glyphLimited, 0, 16); APar_Unified_atom_Put(disknumData_atom, NULL, UTF8_iTunesStyle_256glyphLimited, track->cd_nr, 16); APar_Unified_atom_Put(disknumData_atom, NULL, UTF8_iTunesStyle_256glyphLimited, track->cds, 16); g_free(disk_info); } g_free(atom); // Comment set_limited_text_atom_value(COMMENT, track->comment); // Year gchar *yr = NULL; if (track->year > 0) yr = g_strdup_printf("%d", track->year); set_limited_text_atom_value(YEAR, yr); if (yr) g_free(yr); // Lyrics etr = (ExtraTrackData *) track->userdata; if (etr) write_lyrics_internal(etr->lyrics, filePath, error); // Composer set_limited_text_atom_value(COMPOSER, track->composer); // Grouping set_limited_text_atom_value(GROUPING, track->grouping); // Description set_limited_text_atom_value(DESCRIPTION, track->description); // TV Network set_limited_text_atom_value(TV_NETWORK_NAME, track->tvnetwork); // TV Show Name set_limited_text_atom_value(TV_SHOW, track->tvshow); // TV Episode set_limited_text_atom_value(TV_EPISODE, track->tvepisode); // Compilation atom = g_strdup_printf("%s.%s.%s", ILST_FULL_ATOM, COMPILATION, DATA); if (!track->compilation) { APar_RemoveAtom(atom, VERSIONED_ATOM, 0); } else { //compilation: [0, 0, 0, 0, boolean_value]; BUT that first uint32_t is already accounted for in APar_MetaData_atom_Init value = g_strdup_printf("%d", track->compilation); short compilationData_atom = APar_MetaData_atom_Init(atom, value, AtomFlags_Data_UInt); APar_Unified_atom_Put(compilationData_atom, NULL, UTF8_iTunesStyle_256glyphLimited, 1, 8); //a hard coded uint8_t of: 1 is compilation g_free(value); } g_free(atom); // Tempo / BPM atom = g_strdup_printf("%s.%s.%s", ILST_FULL_ATOM, TEMPO, DATA); if (!track->BPM) { APar_RemoveAtom(atom, VERSIONED_ATOM, 0); } else { //bpm is [0, 0, 0, 0, 0, bpm_value]; BUT that first uint32_t is already accounted for in APar_MetaData_atom_Init value = g_strdup_printf("%d", track->BPM); short bpmData_atom = APar_MetaData_atom_Init(atom, value, AtomFlags_Data_UInt); APar_Unified_atom_Put(bpmData_atom, NULL, UTF8_iTunesStyle_256glyphLimited, track->BPM, 16); g_free(value); } g_free(atom); // Media Type atom = g_strdup_printf("%s.%s.%s", ILST_FULL_ATOM, MEDIA_TYPE, DATA); guint8 mediaTypeTag = mediaTypeToMediaTypeTag(track->mediatype); value = g_strdup_printf("%d", track->season_nr); short stikData_atom = APar_MetaData_atom_Init(atom, value, AtomFlags_Data_UInt); APar_Unified_atom_Put(stikData_atom, NULL, UTF8_iTunesStyle_256glyphLimited, mediaTypeTag, 8); g_free(value); g_free(atom); // TV Season No. atom = g_strdup_printf("%s.%s.%s", ILST_FULL_ATOM, TV_SEASON_NO, DATA); if (track->season_nr == 0) { APar_RemoveAtom(atom, VERSIONED_ATOM, 0); } else { value = g_strdup_printf("%d", track->season_nr); short tvseasonData_atom = APar_MetaData_atom_Init(atom, value, AtomFlags_Data_UInt); APar_Unified_atom_Put(tvseasonData_atom, NULL, UTF8_iTunesStyle_256glyphLimited, 0, 16); APar_Unified_atom_Put(tvseasonData_atom, NULL, UTF8_iTunesStyle_256glyphLimited, track->season_nr, 16); g_free(value); } g_free(atom); // TV Episode No. atom = g_strdup_printf("%s.%s.%s", ILST_FULL_ATOM, TV_EPISODE_NO, DATA); if (track->episode_nr == 0) { APar_RemoveAtom(atom, VERSIONED_ATOM, 0); } else { value = g_strdup_printf("%d", track->episode_nr); short tvepisodenumData_atom = APar_MetaData_atom_Init(atom, value, AtomFlags_Data_UInt); APar_Unified_atom_Put(tvepisodenumData_atom, NULL, UTF8_iTunesStyle_256glyphLimited, 0, 16); APar_Unified_atom_Put(tvepisodenumData_atom, NULL, UTF8_iTunesStyle_256glyphLimited, track->episode_nr, 16); g_free(value); } g_free(atom); // Keywords set_limited_text_atom_value(KEYWORD, track->keywords); // Podcast Category set_limited_text_atom_value(CATEGORY, track->category); // Podcast URL atom = g_strdup_printf("%s.%s.%s", ILST_FULL_ATOM, PODCAST_URL, DATA); if (!track->podcasturl || strlen(track->podcasturl) == 0) { APar_RemoveAtom(atom, VERSIONED_ATOM, 0); } else { short podcasturlData_atom = APar_MetaData_atom_Init(atom, track->podcasturl, AtomFlags_Data_Binary); APar_Unified_atom_Put(podcasturlData_atom, track->podcasturl, UTF8_iTunesStyle_Binary, 0, 0); } g_free(atom); // Gapless Playback atom = g_strdup_printf("%s.%s.%s", ILST_FULL_ATOM, GAPLESS_FLAG, DATA); if (!track->gapless_track_flag) { APar_RemoveAtom(atom, VERSIONED_ATOM, 0); } else { value = g_strdup_printf("%d", track->gapless_track_flag); short gaplessData_atom = APar_MetaData_atom_Init(atom, value, AtomFlags_Data_UInt); APar_Unified_atom_Put(gaplessData_atom, NULL, UTF8_iTunesStyle_256glyphLimited, 1, 8); //a hard coded uint8_t of: 1 is gapl g_free(value); } g_free(atom); // Sort Title set_limited_text_atom_value(SORT_TITLE, track->sort_title); // Sort Artist set_limited_text_atom_value(SORT_ARTIST, track->sort_artist); // Sort Album Artist set_limited_text_atom_value(SORT_ALBUM_ARTIST, track->sort_albumartist); // Sort Composer set_limited_text_atom_value(SORT_COMPOSER, track->sort_composer); // Sort Album set_limited_text_atom_value(SORT_ALBUM, track->sort_album); // Sort TV Show set_limited_text_atom_value(SORT_TV_SHOW, track->sort_tvshow); if (prefs_get_int("coverart_apic")) { GdkPixbuf *pixbuf = (GdkPixbuf*) itdb_artwork_get_pixbuf(track->itdb->device, track->artwork, -1, -1); if (!pixbuf) { // Destroy any existing artwork if any APar_MetaData_atomArtwork_Set("REMOVE_ALL", NULL); } else { gchar *tmp_file = g_build_filename(g_get_tmp_dir(), "ttt.jpg", NULL); GError *pixbuf_err = NULL; gdk_pixbuf_save(pixbuf, tmp_file, "jpeg", &pixbuf_err, "quality", "100", NULL); if (!pixbuf_err) { APar_MetaData_atomArtwork_Set(tmp_file, NULL); g_remove(tmp_file); } else { gtkpod_log_error(error, g_strdup_printf(_("ERROR failed to change track file's artwork.") )); g_error_free(pixbuf_err); return; } g_free(tmp_file); g_object_unref(pixbuf); } } // after all the modifications are enacted on the tree in memory // then write out the changes APar_DetermineAtomLengths(); openSomeFile(filePath, true); APar_WriteFile(filePath, NULL, true); APar_FreeMemory(); }