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();
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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 &image;

    if(column == playlist()->leftColumn() &&
            m_playingItems.contains(const_cast<PlaylistItem *>(this)))
        return &playing;

    return KListViewItem::pixmap(column);
}
Esempio n. 4
0
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();
}
Esempio n. 5
0
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();
}
Esempio n. 6
0
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);
    }
  }
Esempio n. 8
0
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();
}
Esempio n. 9
0
QString PlayerPanel::playlistNext() {
  Q_ASSERT_X(!m_playlist.isEmpty(),"PlayerPanel","playlistNext");

  if (m_playlistPosition>=playlistCount())
    m_playlistPosition = 0;

  return playlist()[m_playlistPosition++];
}
Esempio n. 10
0
Tomahawk::playlist_ptr
LocalCollection::bookmarksPlaylist()
{
    if( TomahawkSettings::instance()->bookmarkPlaylist().isEmpty() )
        return Tomahawk::playlist_ptr();

    return playlist( TomahawkSettings::instance()->bookmarkPlaylist() );
}
Esempio n. 11
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:
            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;
    }
}
Esempio n. 12
0
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;
}
Esempio n. 13
0
/** 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;
}
Esempio n. 14
0
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;
}
Esempio n. 15
0
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]);
    }
}
Esempio n. 16
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:
            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;
    }
}
Esempio n. 17
0
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;
}
Esempio n. 18
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;
    }
}
Esempio n. 19
0
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);
    }
}
Esempio n. 20
0
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;
}
Esempio n. 21
0
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();
}
Esempio n. 22
0
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());
}
Esempio n. 23
0
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);
}
Esempio n. 24
0
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;
  }
}
Esempio n. 25
0
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!";
    }
}
Esempio n. 26
0
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);
}
Esempio n. 27
0
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);
}
Esempio n. 28
0
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);
    }
}
Esempio n. 29
0
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);
        }
    }
}
Esempio n. 30
0
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();
}