1 #include "subscriptionimportview.h"
7 #include "mainwindow.h"
9 QAction *SubscriptionImportView::buildAction(QWidget *parent) {
10 auto a = new QAction("Import subscriptions...", parent);
11 a->setMenuRole(QAction::ApplicationSpecificRole);
12 connect(a, &QAction::triggered, parent, [parent] {
13 auto dialog = new SubscriptionImportView(parent);
19 SubscriptionImportView::SubscriptionImportView(QWidget *parent) : View(parent) {
20 auto layout = new QVBoxLayout(this);
21 layout->setSpacing(fontMetrics().xHeight() * 4);
22 layout->setAlignment(Qt::AlignCenter);
24 auto closeButton = new QToolButton();
25 closeButton->setIcon(IconUtils::icon("close"));
26 closeButton->setIconSize({32, 32});
27 closeButton->setShortcut(Qt::Key_Escape);
28 closeButton->setStyleSheet("border:0");
29 connect(closeButton, &QToolButton::clicked, this, [] { MainWindow::instance()->goBack(); });
30 layout->addWidget(closeButton, 0, Qt::AlignRight);
32 auto icon = new QLabel();
33 icon->setPixmap(IconUtils::icon("import").pixmap(128, 128));
34 layout->addWidget(icon, 0, Qt::AlignHCenter);
36 QString url = "https://takeout.google.com/takeout/custom/youtube";
38 "Follow these steps to import your YouTube subscriptions:<ul>"
39 "<li style='line-height:1.5'>Visit <a href='%1'>%2</a>"
40 "<li style='line-height:1.5'>Click <i>All YouTube data included</i>, deselect all "
41 "and select only subscriptions"
42 "<li style='line-height:1.5'>Download the zip file and extract it";
43 msg = msg.arg(url, "Google Takeout");
44 auto tip = new QLabel(msg);
45 tip->setOpenExternalLinks(true);
46 tip->setFont(FontUtils::medium());
47 layout->addWidget(tip);
49 auto button = new QPushButton("Open subscriptions.csv");
50 button->setDefault(true);
51 connect(this, &View::didAppear, button, [button] { button->setFocus(); });
53 button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
54 connect(button, &QPushButton::clicked, this, [this] {
55 auto dir = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation);
56 QString fileName = QFileDialog::getOpenFileName(this, tr("Open subscriptions.csv"), dir,
57 tr("YouTube data (*.csv *.json)"));
58 if (!fileName.isEmpty()) {
59 auto w = MainWindow::instance();
62 if (file.open(QFile::ReadOnly)) {
64 if (QFileInfo(fileName).suffix().toLower() == "csv") {
66 while (!file.atEnd()) {
67 QByteArray line = file.readLine();
69 auto fields = line.split(',');
70 auto id = fields.first();
71 qDebug() << "Subscribing to" << id;
72 if (YTChannel::subscribe(id)) count++;
77 const auto array = QJsonDocument::fromJson(file.readAll()).array();
78 for (const auto &i : array) {
79 auto id = i["snippet"]["resourceId"]["channelId"].toString();
80 qDebug() << "Subscribing to" << id;
81 if (YTChannel::subscribe(id)) count++;
84 msg = tr("Subscribed to %n channel(s)", "", count);
86 w->getHomeView()->showChannels();
88 msg = tr("Cannot open file");
89 if (!msg.isEmpty()) QTimer::singleShot(0, w, [w, msg] { w->showMessage(msg); });
92 layout->addWidget(button, 0, Qt::AlignHCenter);