void PlaylistManager::load() { Q_D(PlaylistManager); for (auto &playlistmeta : MediaDatabase::instance()->allPlaylistMeta()) { PlaylistPtr emptylist(new Playlist(playlistmeta)); emptylist->load(); insertPlaylist(playlistmeta.uuid, emptylist); } QMap<uint, QString> sortUUIDs; for (auto playlist : d->playlists) { sortUUIDs.insert(playlist->sortID(), playlist->id()); } QSqlDatabase::database().transaction(); if (sortUUIDs.size() != d->playlists.size()) { qWarning() << "playlist order crash, restrot"; d->sortUUIDs.clear(); d->sortUUIDs << SearchMusicListID << AllMusicListID << FavMusicListID; QStringList sortUUIDs; for (auto playlist : d->playlists.values()) { sortUUIDs << playlist->id(); } sortUUIDs.removeAll(SearchMusicListID); sortUUIDs.removeAll(AllMusicListID); sortUUIDs.removeAll(FavMusicListID); d->sortUUIDs << sortUUIDs; saveSortOrder(); } else { for (auto sortID = 0; sortID < sortUUIDs.size(); ++sortID) { d->sortUUIDs << sortUUIDs.value(static_cast<uint>(sortID)); } } auto all = playlist(AllMusicListID); auto trAllName = tr("All Music"); if (!all.isNull() && all->displayName() != trAllName) { all->setDisplayName(trAllName); } auto fav = playlist(FavMusicListID); auto trFavName = tr("My favorites"); if (!fav.isNull() && fav->displayName() != trFavName) { fav->setDisplayName(trFavName); } auto search = playlist(SearchMusicListID); auto searchName = tr("Search result"); if (!search.isNull() && search->displayName() != searchName) { search->setDisplayName(searchName); } QSqlDatabase::database().commit(); }
void PlaylistItem::setText(int column, const QString &text) { int offset = playlist()->columnOffset(); if(column - offset >= 0 && column + offset <= lastColumn()) { KListViewItem::setText(column, QString::null); return; } KListViewItem::setText(column, text); playlist()->slotWeightDirty(column); }
const QPixmap *PlaylistItem::pixmap(int column) const { static QPixmap image(SmallIcon("image")); static QPixmap playing(UserIcon("playing")); int offset = playlist()->columnOffset(); if((column - offset) == CoverColumn && d->fileHandle.coverInfo()->hasCover()) return ℑ if(column == playlist()->leftColumn() && m_playingItems.contains(const_cast<PlaylistItem *>(this))) return &playing; return KListViewItem::pixmap(column); }
void NPlaylistStorage::writeM3u(const QString &file, QList<NPlaylistDataItem> items, N::M3uExtention ext) { QFile playlist(file); if (!playlist.open(QFile::WriteOnly | QFile::Truncate)) return; QString playlistPath = QFileInfo(file).absolutePath(); QTextStream out(&playlist); out.setCodec("UTF-8"); if (ext >= N::ExtM3u) out << "#EXTM3U\n"; for (int i = 0; i < items.count(); ++i) { bool failed = items.at(i).failed || !QFileInfo(items.at(i).path).exists(); if (ext == N::NulloyM3u) out << "#NULLOY:" << failed << "," << items.at(i).count << "," << items.at(i).position << "\n"; if (ext >= N::ExtM3u) out << "#EXTINF:" << items.at(i).duration << "," << items.at(i).title << "\n"; if (QFileInfo(items.at(i).path).exists()) { if (playlistPath == QFileInfo(items.at(i).path).absolutePath()) // same directory out << QFileInfo(items.at(i).path).fileName() << "\n"; else out << QFileInfo(items.at(i).path).absoluteFilePath() << "\n"; } else { // keep as is out << items.at(i).path << "\n"; } } playlist.close(); }
void DubPlaylist::init() { kdDebug(90010) << "dub: init" << endl; dubconfig = new DubConfigModule(this); // we pass this around to dub app dub = new Dub(this); kdDebug(90010) << "dub: init: test playlist() " << endl; playlist(); }
QModelIndex KNMusicPlaylistManager::copyPlaylist(const QModelIndex &index) { //Check the validation of the index. if(!index.isValid()) { //Ignore the invalid operation. return QModelIndex(); } //Generate the playlist. KNMusicPlaylistModel *model=new KNMusicPlaylistModel(m_workingThread, m_playlistList), //Get the source playlist model. *sourceModel=playlist(index); //Set the copy model title. model->setTitle(generateTitle(sourceModel->title())); //Copy the playlist data. model->appendRows(sourceModel->playlistDetailInfos()); //Allocate a file path. model->allcateFilePath(); //Save the source model. writeModelToFile(sourceModel, sourceModel->filePath()); //Save the copied model. writeModelToFile(model, model->filePath()); //Add the model to the playlist. return m_playlistList->insert(index.row()+1, model); }
void XSPFParser::Save(const SongList& songs, QIODevice* device, const QDir&) const { QXmlStreamWriter writer(device); writer.writeStartDocument(); StreamElement playlist("playlist", &writer); writer.writeAttribute("version", "1"); writer.writeDefaultNamespace("http://xspf.org/ns/0/"); StreamElement tracklist("trackList", &writer); foreach (const Song& song, songs) { StreamElement track("track", &writer); writer.writeTextElement("location", song.url().toString()); writer.writeTextElement("title", song.title()); if (!song.artist().isEmpty()) { writer.writeTextElement("creator", song.artist()); } if (!song.album().isEmpty()) { writer.writeTextElement("album", song.album()); } if (song.length_nanosec() != -1) { writer.writeTextElement("duration", QString::number(song.length_nanosec() / kNsecPerMsec)); } QString art = song.art_manual().isEmpty() ? song.art_automatic() : song.art_manual(); // Ignore images that are in our resource bundle. if (!art.startsWith(":") && !art.isEmpty()) { // Convert local files to URLs. if (!art.contains("://")) { art = QUrl::fromLocalFile(art).toString(); } writer.writeTextElement("image", art); } }
int main(int argc, char *argv[]) { QApplication app(argc, argv); QQmlApplicationEngine engine; Playlist playlist(QString("simon")); playlist.addSong(new Song("Ziggy Stardust", "David Bowie", "Ziggy Stardust and the ...", "/home/simon/Music/ziggy.mp3", 142)); playlist.addSong(new Song("Five Years", "David Bowie", "Ziggy Stardust and the ...", "/home/simon/Music/five.mp3", 142)); QList<QObject *> playlistlist; playlistlist.append(&playlist); Player player(&playlist); player.setCurrentPlaylist(&playlist); engine.rootContext()->setContextProperty("player", &player); engine.rootContext()->setContextProperty("playlistlist", QVariant::fromValue(playlistlist)); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); }
QString PlayerPanel::playlistNext() { Q_ASSERT_X(!m_playlist.isEmpty(),"PlayerPanel","playlistNext"); if (m_playlistPosition>=playlistCount()) m_playlistPosition = 0; return playlist()[m_playlistPosition++]; }
Tomahawk::playlist_ptr LocalCollection::bookmarksPlaylist() { if( TomahawkSettings::instance()->bookmarkPlaylist().isEmpty() ) return Tomahawk::playlist_ptr(); return playlist( TomahawkSettings::instance()->bookmarkPlaylist() ); }
void ActionsManager::doAction( int id_action ) { switch( id_action ) { case PLAY_ACTION: play(); break; case STOP_ACTION: THEMIM->stop(); break; case OPEN_ACTION: THEDP->openDialog(); break; case PREVIOUS_ACTION: THEMIM->prev(); break; case NEXT_ACTION: THEMIM->next(); break; case SLOWER_ACTION: THEMIM->getIM()->slower(); break; case FASTER_ACTION: THEMIM->getIM()->faster(); break; case FULLSCREEN_ACTION: fullscreen(); break; case EXTENDED_ACTION: THEDP->extendedDialog(); break; case PLAYLIST_ACTION: playlist(); break; case SNAPSHOT_ACTION: snapshot(); break; case RECORD_ACTION: record(); break; case FRAME_ACTION: frame(); break; case ATOB_ACTION: THEMIM->getIM()->setAtoB(); break; case REVERSE_ACTION: THEMIM->getIM()->reverse(); break; case SKIP_BACK_ACTION: skipBackward(); break; case SKIP_FW_ACTION: skipForward(); break; case QUIT_ACTION: THEDP->quit(); break; case RANDOM_ACTION: THEMIM->toggleRandom(); break; case INFO_ACTION: THEDP->mediaInfoDialog(); break; case OPEN_SUB_ACTION: THEDP->loadSubtitlesFile(); break; case FULLWIDTH_ACTION: if( p_intf->p_sys->p_mi ) p_intf->p_sys->p_mi->getFullscreenControllerWidget()->toggleFullwidth(); break; default: msg_Warn( p_intf, "Action not supported: %i", id_action ); break; } }
QList<NPlaylistDataItem> NPlaylistStorage::readM3u(const QString &file) { QList<NPlaylistDataItem> dataItemsList; QString nulloyPrefix = "#NULLOY:"; QString extinfPrefix = "#EXTINF:"; QString line; QFile playlist(file); if (!playlist.exists() || !playlist.open(QFile::ReadOnly)) return dataItemsList; NPlaylistDataItem dataItem; QTextStream in(&playlist); in.setCodec("UTF-8"); while (!in.atEnd()) { line = in.readLine(); if (line.trimmed().isEmpty()) continue; if (line.startsWith("#")) { if (line.startsWith(nulloyPrefix)) { line.remove(0, nulloyPrefix.size()); QStringList split = line.split(","); if (split.count() != 3) continue; dataItem.failed = split.at(0).toInt(); dataItem.count = split.at(1).toInt(); dataItem.position = split.at(2).toFloat(); } else if (line.startsWith(extinfPrefix)) { line.remove(0, extinfPrefix.size()); QStringList split = line.split(","); if (split.count() != 2) continue; dataItem.duration = split.at(0).toInt(); dataItem.title = split.at(1); } } else { if (QFileInfo(line).isAbsolute()) dataItem.path = line; else dataItem.path = QFileInfo(file).absolutePath() + "/" + line; if (dataItem.title.isEmpty()) dataItem.title = line; dataItemsList << dataItem; dataItem = NPlaylistDataItem(); } } playlist.close(); return dataItemsList; }
/** Add a new playlist tab. */ Playlist* TabPlaylist::addPlaylist() { QString newPlaylistName = tr("Playlist %1").arg(count() + 1); QByteArray ba; if (playlists().isEmpty()) { ba = SettingsPrivate::instance()->lastActivePlaylistGeometry(); } else { ba = currentPlayList()->horizontalHeader()->saveState(); } // Then append a new empty playlist to the others Playlist *p = new Playlist(_mediaPlayer, this); p->installEventFilter(this); if (!ba.isEmpty()) { p->horizontalHeader()->restoreState(ba); } // Always create an icon in Disabled mode. It will be enabled when one will provide some tracks int i = addTab(p, newPlaylistName); this->setTabIcon(i, this->defaultIcon(QIcon::Disabled)); connect(p->mediaPlaylist(), &QMediaPlaylist::mediaRemoved, this, [=](int start, int) { if (_mediaPlayer.data()->playlist() == p->mediaPlaylist() && p->mediaPlaylist()->currentIndex() == start) { _mediaPlayer.data()->stop(); } }); // Forward from inner class to MainWindow the signals connect(p, &Playlist::aboutToSendToTagEditor, this, &TabPlaylist::aboutToSendToTagEditor); connect(p, &Playlist::selectionChanged, this, &TabPlaylist::selectionChanged); // Check if tab icon should indicate that playlist has changed or not connect(p, &Playlist::contentHasChanged, this, [=]() { int playlistTabIndex = -1; for (int i = 0; i < playlists().count(); i++) { if (p == playlist(i)) { playlistTabIndex = i; break; } } if (playlistTabIndex != -1) { if (p->hash() != p->generateNewHash()) { this->setTabIcon(playlistTabIndex, this->defaultIcon(QIcon::Normal)); } } }); // Select the new empty playlist setCurrentIndex(i); uint hash = qHash(p); this->tabBar()->setTabData(i, hash); emit playlistCreated(); return p; }
Mlt::ClipInfo *TimelineDock::getClipInfo(int trackIndex, int clipIndex) { Mlt::ClipInfo* result = 0; if (clipIndex >= 0 && trackIndex >= 0) { int i = m_model.trackList().at(trackIndex).mlt_index; QScopedPointer<Mlt::Producer> track(m_model.tractor()->track(i)); if (track) { Mlt::Playlist playlist(*track); result = playlist.clip_info(clipIndex); } } return result; }
int PlaylistItem::compare(const PlaylistItem *firstItem, const PlaylistItem *secondItem, int column, bool) const { int offset = playlist()->columnOffset(); if(column < 0 || column > lastColumn() + offset) return 0; if(column < offset) { QString first = firstItem->text(column).lower(); QString second = secondItem->text(column).lower(); return first.localeAwareCompare(second); } switch(column - offset) { case TrackNumberColumn: if(firstItem->d->fileHandle.tag()->track() > secondItem->d->fileHandle.tag()->track()) return 1; else if(firstItem->d->fileHandle.tag()->track() < secondItem->d->fileHandle.tag()->track()) return -1; else return 0; break; case LengthColumn: if(firstItem->d->fileHandle.tag()->seconds() > secondItem->d->fileHandle.tag()->seconds()) return 1; else if(firstItem->d->fileHandle.tag()->seconds() < secondItem->d->fileHandle.tag()->seconds()) return -1; else return 0; break; case BitrateColumn: if(firstItem->d->fileHandle.tag()->bitrate() > secondItem->d->fileHandle.tag()->bitrate()) return 1; else if(firstItem->d->fileHandle.tag()->bitrate() < secondItem->d->fileHandle.tag()->bitrate()) return -1; else return 0; break; case CoverColumn: if(firstItem->d->fileHandle.coverInfo()->hasCover() == secondItem->d->fileHandle.coverInfo()->hasCover()) return 0; else if (firstItem->d->fileHandle.coverInfo()->hasCover()) return -1; else return 1; break; default: return strcoll(firstItem->d->local8Bit[column - offset], secondItem->d->local8Bit[column - offset]); } }
void ActionsManager::doAction( int id_action ) { switch( id_action ) { case PLAY_ACTION: play(); break; case STOP_ACTION: THEMIM->stop(); break; case OPEN_ACTION: THEDP->openDialog(); break; case PREVIOUS_ACTION: THEMIM->prev(); break; case NEXT_ACTION: THEMIM->next(); break; case SLOWER_ACTION: THEMIM->getIM()->slower(); break; case FASTER_ACTION: THEMIM->getIM()->faster(); break; case FULLSCREEN_ACTION: fullscreen(); break; case EXTENDED_ACTION: THEDP->extendedDialog(); break; case PLAYLIST_ACTION: playlist(); break; case SNAPSHOT_ACTION: snapshot(); break; case RECORD_ACTION: record(); break; case FRAME_ACTION: frame(); break; case ATOB_ACTION: THEMIM->getIM()->setAtoB(); break; case REVERSE_ACTION: THEMIM->getIM()->reverse(); break; case SKIP_BACK_ACTION: skipBackward(); break; case SKIP_FW_ACTION: skipForward(); break; case QUIT_ACTION: THEDP->quit(); break; case RANDOM_ACTION: THEMIM->toggleRandom(); break; case INFO_ACTION: THEDP->mediaInfoDialog(); break; default: msg_Dbg( p_intf, "Action: %i", id_action ); break; } }
int TimelineDock::clipCount(int trackIndex) const { if (trackIndex < 0) trackIndex = currentTrack(); if (trackIndex >= 0 && trackIndex < m_model.trackList().size()) { int i = m_model.trackList().at(trackIndex).mlt_index; QScopedPointer<Mlt::Producer> track(m_model.tractor()->track(i)); if (track) { Mlt::Playlist playlist(*track); return playlist.count(); } } return 0; }
void ActionsManager::doAction( int id_action ) { switch( id_action ) { case PLAY_ACTION: play(); break; case STOP_ACTION: THEMIM->stop(); break; case OPEN_ACTION: THEDP->openDialog(); break; case PREVIOUS_ACTION: THEMIM->prev(); break; case NEXT_ACTION: THEMIM->next(); break; case SLOWER_ACTION: THEMIM->getIM()->slower(); break; case FASTER_ACTION: THEMIM->getIM()->faster(); break; case FULLSCREEN_ACTION: fullscreen(); break; case EXTENDED_ACTION: THEDP->extendedDialog(); break; case PLAYLIST_ACTION: playlist(); break; case SNAPSHOT_ACTION: snapshot(); break; case RECORD_ACTION: record(); break; case FRAME_ACTION: frame(); break; case ATOB_ACTION: THEMIM->getIM()->setAtoB(); break; case REVERSE_ACTION: THEMIM->getIM()->reverse(); break; case SKIP_BACK_ACTION: var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_SHORT ); break; case SKIP_FW_ACTION: var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_SHORT ); break; case QUIT_ACTION: THEDP->quit(); break; default: msg_Dbg( p_intf, "Action: %i", id_action ); break; } }
int PlaylistItem::compare(QListViewItem *item, int column, bool ascending) const { // reimplemented from QListViewItem int offset = playlist()->columnOffset(); if(!item) return 0; PlaylistItem *playlistItem = static_cast<PlaylistItem *>(item); // The following statments first check to see if you can sort based on the // specified column. If the values for the two PlaylistItems are the same // in that column it then trys to sort based on columns 1, 2, 3 and 0, // (artist, album, track number, track name) in that order. int c = compare(this, playlistItem, column, ascending); if(c != 0) return c; else { // Loop through the columns doing comparisons until something is differnt. // If all else is the same, compare the track name. int last = playlist()->isColumnVisible(AlbumColumn + offset) ? TrackNumberColumn : ArtistColumn; for(int i = ArtistColumn; i <= last; i++) { if(playlist()->isColumnVisible(i + offset)) { c = compare(this, playlistItem, i, ascending); if(c != 0) return c; } } return compare(this, playlistItem, TrackColumn + offset, ascending); } }
int TimelineDock::clipIndexAtPosition(int trackIndex, int position) { int result = -1; if (trackIndex < 0) trackIndex = currentTrack(); if (trackIndex >= 0 && trackIndex < m_model.trackList().size()) { int i = m_model.trackList().at(trackIndex).mlt_index; QScopedPointer<Mlt::Producer> track(m_model.tractor()->track(i)); if (track) { Mlt::Playlist playlist(*track); result = playlist.get_clip_index_at(position); } } return result; }
void PlaylistManager::onCustomResort(QStringList uuids) { Q_D(PlaylistManager); Q_ASSERT(uuids.length() == d->playlists.size() - 1); uuids.push_front(playlist(SearchMusicListID)->id()); d->sortUUIDs.clear(); for (auto sortID = 0; sortID < uuids.length(); ++sortID) { d->sortUUIDs << uuids.value(sortID); } QSqlDatabase::database().transaction(); saveSortOrder(); QSqlDatabase::database().commit(); }
void TimelineDock::onProducerChanged(Mlt::Producer* after) { int trackIndex = currentTrack(); if (trackIndex < 0 || selection().isEmpty() || !m_updateCommand || !after || !after->is_valid()) return; if (isTrackLocked(trackIndex)) { pulseLockButtonOnTrack(trackIndex); return; } int i = m_model.trackList().at(trackIndex).mlt_index; QScopedPointer<Mlt::Producer> track(m_model.tractor()->track(i)); if (track) { // Ensure the new XML has same in/out point as selected clip by making // a copy of the changed producer and copying the in/out from timeline. Mlt::Playlist playlist(*track); int clipIndex = selection().first(); QScopedPointer<Mlt::ClipInfo> info(playlist.clip_info(clipIndex)); if (info) { double oldSpeed = qstrcmp("timewarp", info->producer->get("mlt_service")) ? 1.0 : info->producer->get_double("warp_speed"); double newSpeed = qstrcmp("timewarp", after->get("mlt_service")) ? 1.0 : after->get_double("warp_speed"); double speedRatio = oldSpeed / newSpeed; int length = qRound(info->length * speedRatio); int in = qMin(qRound(info->frame_in * speedRatio), length - 1); int out = qMin(qRound(info->frame_out * speedRatio), length - 1); after->set("length", length); after->set_in_and_out(in, out); // Adjust filters. int n = after->filter_count(); for (int j = 0; j < n; j++) { QScopedPointer<Mlt::Filter> filter(after->filter(j)); if (filter && filter->is_valid() && !filter->get_int("_loader")) { in = qMin(qRound(filter->get_in() * speedRatio), length - 1); out = qMin(qRound(filter->get_out() * speedRatio), length - 1); filter->set_in_and_out(in, out); //TODO: keyframes } } } } QString xmlAfter = MLT.XML(after); m_updateCommand->setXmlAfter(xmlAfter); setSelection(); // clearing selection prevents a crash MAIN.undoStack()->push(m_updateCommand.take()); }
PlaylistItem::~PlaylistItem() { // Although this isn't the most efficient way to accomplish the task of // stopping playback when deleting the item being played, it has the // stark advantage of working reliably. I'll tell anyone who tries to // optimize this, the timing issues can be *hard*. -- mpyne m_collectionItem->removeChildItem(this); if(m_playingItems.find(this) != m_playingItems.end()) { m_playingItems.remove(this); if(m_playingItems.isEmpty()) playlist()->setPlaying(0); } if(m_watched) Pointer::clear(this); }
tiz::playlist tiz::playlist::obtain_next_sub_playlist ( const list_direction_t up_or_down) { if (uri_list_.empty () || single_format ()) { return playlist (get_uri_list ()); } else { assert (up_or_down < DirMax); if (up_or_down == DirUp) { const int sub_lists = sub_list_indexes_.size () - 1; current_sub_list_++; if (current_sub_list_ >= sub_lists) { current_sub_list_ = 0; } } else { if (current_sub_list_ <= 0) { current_sub_list_ = sub_list_indexes_.size () - 1; } --current_sub_list_; } size_t index1 = sub_list_indexes_[current_sub_list_]; size_t index2 = sub_list_indexes_[current_sub_list_ + 1]; uri_lst_t::const_iterator first = uri_list_.begin () + index1; uri_lst_t::const_iterator last = uri_list_.begin () + index2; TIZ_LOG (TIZ_PRIORITY_TRACE, "current_sub_list_ [%d] index1 [%d] index2_ [%d]...", current_sub_list_, index1, index2); playlist new_list (uri_lst_t (first, last)); assert (new_list.single_format ()); current_index_ = index1; return new_list; } }
void AddTransitionCommand::undo() { if (m_transitionIndex >= 0) { m_model.removeTransition(m_trackIndex, m_transitionIndex); // Delete the blank that was inserted. int i = m_model.trackList().at(m_trackIndex).mlt_index; QScopedPointer<Mlt::Producer> track(m_model.tractor()->track(i)); if (track) { Mlt::Playlist playlist(*track); if (playlist.is_blank(m_clipIndex + 1) && m_transitionIndex == m_clipIndex) { // dragged left m_model.removeClip(m_trackIndex, m_clipIndex + 1); } else if (playlist.is_blank(m_clipIndex)) { m_model.removeClip(m_trackIndex, m_clipIndex); } } } else { qWarning() << "Failed to undo the transition!"; } }
void TimelineDock::seekNextEdit() { if (!MLT.isMultitrack()) return; if (!m_model.tractor()) return; int newPosition = std::numeric_limits<int>::max(); int n = m_model.tractor()->count(); for (int i = 0; i < n; i++) { QScopedPointer<Mlt::Producer> track(m_model.tractor()->track(i)); if (track) { Mlt::Playlist playlist(*track); int clipIndex = playlist.get_clip_index_at(m_position) + 1; if (clipIndex < playlist.count()) newPosition = qMin(newPosition, playlist.clip_start(clipIndex)); else if (clipIndex == playlist.count()) newPosition = qMin(newPosition, playlist.clip_start(clipIndex) + playlist.clip_length(clipIndex)); } } if (newPosition != m_position) setPosition(newPosition); }
void TimelineDock::seekPreviousEdit() { if (!MLT.isMultitrack()) return; if (!m_model.tractor()) return; int newPosition = -1; int n = m_model.tractor()->count(); for (int i = 0; i < n; i++) { QScopedPointer<Mlt::Producer> track(m_model.tractor()->track(i)); if (track) { Mlt::Playlist playlist(*track); int clipIndex = playlist.get_clip_index_at(m_position); if (clipIndex >= 0 && m_position == playlist.clip_start(clipIndex)) --clipIndex; if (clipIndex >= 0) newPosition = qMax(newPosition, playlist.clip_start(clipIndex)); } } if (newPosition != m_position) setPosition(newPosition); }
QString PlaylistItem::text(int column) const { if(!d->fileHandle.tag()) return QString::null; int offset = playlist()->columnOffset(); switch(column - offset) { case TrackColumn: return d->fileHandle.tag()->title(); case ArtistColumn: return d->fileHandle.tag()->artist(); case AlbumColumn: return d->fileHandle.tag()->album(); case CoverColumn: return QString::null; case TrackNumberColumn: return d->fileHandle.tag()->track() > 0 ? QString::number(d->fileHandle.tag()->track()) : QString::null; case GenreColumn: return d->fileHandle.tag()->genre(); case YearColumn: return d->fileHandle.tag()->year() > 0 ? QString::number(d->fileHandle.tag()->year()) : QString::null; case LengthColumn: return d->fileHandle.tag()->lengthString(); case BitrateColumn: return QString::number(d->fileHandle.tag()->bitrate()); case CommentColumn: return d->fileHandle.tag()->comment(); case FileNameColumn: return d->fileHandle.fileInfo().fileName(); case FullPathColumn: return d->fileHandle.fileInfo().absFilePath(); default: return KListViewItem::text(column); } }
void RemoveTrackCommand::undo() { m_model.insertTrack(m_trackIndex, m_trackType); m_model.setTrackName(m_trackIndex, m_trackName); // Restore track from XML. Mlt::Producer producer(MLT.profile(), "xml-string", m_xml.toUtf8().constData()); Mlt::Playlist playlist(producer); m_model.appendFromPlaylist(&playlist, m_trackIndex); // Re-attach filters. int n = playlist.filter_count(); if (n > 0) { int mlt_index = m_model.trackList().at(m_trackIndex).mlt_index; QScopedPointer<Mlt::Producer> producer(m_model.tractor()->multitrack()->track(mlt_index)); for (int i = 0; i < n; ++i) { QScopedPointer<Mlt::Filter> filter(playlist.filter(i)); if (filter && filter->is_valid()) producer->attach(*filter); } } }
void NM3uPlaylist::write(const QString &file, QList<NM3uItem> items) { QFile playlist(file); if (!playlist.open(QFile::WriteOnly | QFile::Truncate)) return; QTextStream out(&playlist); out << "#EXTM3U\n"; for (int i = 0; i < items.count(); ++i) { QString itemPath = QFileInfo(items.at(i).path).canonicalFilePath(); if (items.at(i).position != 0) out << "#NULLOY:" << items.at(i).position << "\n"; if (items.at(i).position != -1 && !QFileInfo(itemPath).exists()) // keep old item, but mark failed out << "#NULLOY:" << -1 << "\n"; out << "#EXTINF:" << items.at(i).duration << "," << items.at(i).title << "\n"; out << itemPath << "\n"; } playlist.close(); }