void SongLoader::LoadLocalAsync(const QString& filename) { // First check to see if it's a directory - if so we will load all the songs // inside right away. if (QFileInfo(filename).isDir()) { LoadLocalDirectory(filename); return; } // It's a local file, so check if it looks like a playlist. // Read the first few bytes. QFile file(filename); if (!file.open(QIODevice::ReadOnly)) return; QByteArray data(file.read(PlaylistParser::kMagicSize)); ParserBase* parser = playlist_parser_->ParserForMagic(data); if (!parser) { // Check the file extension as well, maybe the magic failed, or it was a // basic M3U file which is just a plain list of filenames. parser = playlist_parser_->ParserForExtension( QFileInfo(filename).suffix().toLower()); } if (parser) { qLog(Debug) << "Parsing using" << parser->name(); // It's a playlist! LoadPlaylist(parser, filename); return; } // Check if it's a cue file QString matching_cue = filename.section('.', 0, -2) + ".cue"; if (QFile::exists(matching_cue)) { // it's a cue - create virtual tracks QFile cue(matching_cue); cue.open(QIODevice::ReadOnly); SongList song_list = cue_parser_->Load(&cue, matching_cue, QDir(filename.section('/', 0, -2))); for (Song song : song_list) { if (song.is_valid()) songs_ << song; } return; } // Assume it's just a normal file Song song; song.InitFromFilePartial(filename); if (song.is_valid()) { songs_ << song; } }
SongLoader::Result SongLoader::LoadLocal(const QString& filename) { qLog(Debug) << "Loading local file" << filename; // First check to see if it's a directory - if so we can load all the songs // inside right away. if (QFileInfo(filename).isDir()) { ConcurrentRun::Run<void>( &thread_pool_, std::bind(&SongLoader::LoadLocalDirectoryAndEmit, this, filename)); return WillLoadAsync; } // It's a local file, so check if it looks like a playlist. // Read the first few bytes. QFile file(filename); if (!file.open(QIODevice::ReadOnly)) return Error; QByteArray data(file.read(PlaylistParser::kMagicSize)); ParserBase* parser = playlist_parser_->ParserForMagic(data); if (!parser) { // Check the file extension as well, maybe the magic failed, or it was a // basic M3U file which is just a plain list of filenames. parser = playlist_parser_->ParserForExtension(QFileInfo(filename).suffix()); } if (parser) { qLog(Debug) << "Parsing using" << parser->name(); // It's a playlist! ConcurrentRun::Run<void>( &thread_pool_, std::bind(&SongLoader::LoadPlaylistAndEmit, this, parser, filename)); return WillLoadAsync; } // Not a playlist, so just assume it's a song QUrl url = QUrl::fromLocalFile(filename); LibraryQuery query; query.SetColumnSpec("%songs_table.ROWID, " + Song::kColumnSpec); query.AddWhere("filename", url.toEncoded()); SongList song_list; if (library_->ExecQuery(&query) && query.Next()) { // we may have many results when the file has many sections do { Song song; song.InitFromQuery(query, true); song_list << song; } while (query.Next()); } else { QString matching_cue = filename.section('.', 0, -2) + ".cue"; if (QFile::exists(matching_cue)) { // it's a cue - create virtual tracks QFile cue(matching_cue); cue.open(QIODevice::ReadOnly); song_list = cue_parser_->Load(&cue, matching_cue, QDir(filename.section('/', 0, -2))); } else { // it's a normal media file, load it asynchronously. TagReaderReply* reply = TagReaderClient::Instance()->ReadFile(filename); NewClosure(reply, SIGNAL(Finished(bool)), this, SLOT(LocalFileLoaded(TagReaderReply*)), reply); return WillLoadAsync; } } for (const Song& song : song_list) { if (song.is_valid()) { songs_ << song; } } return Success; }