/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine 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 General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "connecteddevice.h" #include "gpodloader.h" #include "core/song.h" #include "core/taskmanager.h" #include "library/librarybackend.h" #include #include #include GPodLoader::GPodLoader(const QString& mount_point, TaskManager* task_manager, LibraryBackend* backend, boost::shared_ptr device) : QObject(NULL), device_(device), mount_point_(mount_point), type_(Song::Type_Unknown), task_manager_(task_manager), backend_(backend) { original_thread_ = thread(); } GPodLoader::~GPodLoader() { } void GPodLoader::LoadDatabase() { int task_id = task_manager_->StartTask(tr("Loading iPod database")); emit TaskStarted(task_id); // Load the iTunes database GError* error = NULL; Itdb_iTunesDB* db = itdb_parse( QDir::toNativeSeparators(mount_point_).toLocal8Bit(), &error); // Check for errors if (!db) { if (error) { qDebug() << "GPodLoader error:" << error->message; emit Error(QString::fromUtf8(error->message)); g_error_free(error); } else { emit Error(tr("An error occurred loading the iTunes database")); } task_manager_->SetTaskFinished(task_id); return; } // Convert all the tracks from libgpod structs into Song classes SongList songs; for (GList* tracks = db->tracks ; tracks != NULL ; tracks = tracks->next) { Itdb_Track* track = static_cast(tracks->data); Song song; song.InitFromItdb(track); song.set_directory_id(1); QString filename = (path_prefix_.isEmpty() ? mount_point_ : path_prefix_) + song.filename(); if (path_prefix_.isEmpty()) filename = QDir::cleanPath(QDir::fromNativeSeparators(filename)); song.set_filename(filename); if (type_ != Song::Type_Unknown) song.set_filetype(type_); songs << song; } // Need to remove all the existing songs in the database first backend_->DeleteSongs(backend_->FindSongsInDirectory(1)); // Add the songs we've just loaded backend_->AddOrUpdateSongs(songs); moveToThread(original_thread_); task_manager_->SetTaskFinished(task_id); emit LoadFinished(db); }