Re: [Tails-dev] minitube (Youtube client)

Delete this message

Reply to this message
Author: Alessandro Grassi
Date:  
To: tails-dev
Subject: Re: [Tails-dev] minitube (Youtube client)
Hi,

2012/12/18, intrigeri <intrigeri@???>:
> Did you already send this patch to them, by the way?
> (If not, I encourage you to do so :)

I sent a mail to the mantainer but he didn't answer (yet).

> Great! How about searching the source for code that accesses the
> history (probably basing the search on the place / name of the files /
> storage methods that contain the history) too? This code may, or may
> not, contain the "recent" word.

I found it. Settings file is accessede using the QSettings class, so
for example this code removes keywords history:

MainWindow.cpp
-----------------------------
.....
void MainWindow::clearRecentKeywords() {
    QSettings settings;
    settings.remove("recentKeywords");
    settings.remove("recentChannels");
    searchView->updateRecentKeywords();
    searchView->updateRecentChannels();
    statusBar()->showMessage(tr("Your privacy is now safe"));
}
.....


The following code saves the keyword after a search (with
settings.setValue(recentKeywordsKey, keywords); ):

ListModel.cpp
----------------------
.....
static const QString recentKeywordsKey = "recentKeywords";
static const QString recentChannelsKey = "recentChannels";
.....
void ListModel::addVideo(Video* video) {

    connect(video, SIGNAL(gotThumbnail()), this, SLOT(updateThumbnail()));


    beginInsertRows(QModelIndex(), videos.size(), videos.size());
    videos << video;
    endInsertRows();


    // first result!
    if (videos.size() == 1) {


        // manualplay
        QSettings settings;
        if (!settings.value("manualplay", false).toBool())
            setActiveRow(0);


        // save keyword
        QString query = searchParams->keywords();
        if (!query.isEmpty() && !searchParams->isTransient()) {
            if (query.startsWith("http://")) {
                // Save the video title
                query += "|" + videos.first()->title();
            }
            QStringList keywords =
settings.value(recentKeywordsKey).toStringList();
            keywords.removeAll(query);
            keywords.prepend(query);
            while (keywords.size() > 10)
                keywords.removeLast();
            settings.setValue(recentKeywordsKey, keywords);
        }


        // save channel
        QString channel = searchParams->author();
        if (!channel.isEmpty() && !searchParams->isTransient()) {
            QSettings settings;
            QStringList channels =
settings.value(recentChannelsKey).toStringList();
            channels.removeAll(channel);
            channels.prepend(channel);
            while (channels.size() > 10)
                channels.removeLast();
            settings.setValue(recentChannelsKey, channels);
        }


    }


}
......

and this last function loads the keywords (with
settings.value(recentKeywordsKey) ) and displays them under the serch
box:

SearchView.cpp
-------------------------
.....
static const QString recentKeywordsKey = "recentKeywords";
static const QString recentChannelsKey = "recentChannels";
.....
void SearchView::updateRecentKeywords() {

    // cleanup
    QLayoutItem *item;
    while ((item = recentKeywordsLayout->takeAt(1)) != 0) {
        item->widget()->close();
        delete item;
    }


    // load
    QSettings settings;
    QStringList keywords = settings.value(recentKeywordsKey).toStringList();
    recentKeywordsLabel->setVisible(!keywords.isEmpty());
    The::globalActions()->value("clearRecentKeywords")->setEnabled(!keywords.isEmpty());


    foreach (QString keyword, keywords) {
        QString link = keyword;
        QString display = keyword;
        if (keyword.startsWith("http://") || keyword.startsWith("https://")) {
            int separator = keyword.indexOf("|");
            if (separator > 0 && separator + 1 < keyword.length()) {
                link = keyword.left(separator);
                display = keyword.mid(separator+1);
            }
        }
        bool needStatusTip = false;
        if (display.length() > 24) {
            display.truncate(24);
            display.append("...");
            needStatusTip = true;
        }
        QLabel *itemLabel = new QLabel("<a href=\"" + link
                                       + "\"
style=\"color:palette(text); text-decoration:none\">"
                                       + display + "</a>", this);
        itemLabel->setAttribute(Qt::WA_DeleteOnClose);
        itemLabel->setProperty("recentItem", true);
        itemLabel->setMaximumWidth(queryEdit->width() + watchButton->width());
        // itemLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
        // Make links navigable with the keyboard too
        itemLabel->setTextInteractionFlags(Qt::LinksAccessibleByKeyboard

| Qt::LinksAccessibleByMouse);

        if (needStatusTip)
            itemLabel->setStatusTip(link);
        connect(itemLabel, SIGNAL(linkActivated(QString)), this,
SLOT(watchKeywords(QString)));
        recentKeywordsLayout->addWidget(itemLabel);
    }


}
.....

There is a similar function for recent channels. There are no other
references to "recentKeywords" and "recentChannels" in the code.

Greetings
Alessandro