comparison src/gui/pages/torrents.cc @ 202:71832ffe425a

animia: re-add kvm fd source this is all being merged from my wildly out-of-date laptop. SORRY! in other news, I edited the CI file to install the wayland client as well, so the linux CI build might finally get wayland stuff.
author Paper <paper@paper.us.eu.org>
date Tue, 02 Jan 2024 06:05:06 -0500
parents 01d259b9c89f
children 53211cb1e7f5
comparison
equal deleted inserted replaced
201:8f6f8dd2eb23 202:71832ffe425a
2 #include "core/strings.h" 2 #include "core/strings.h"
3 #include "core/http.h" 3 #include "core/http.h"
4 #include "core/session.h" 4 #include "core/session.h"
5 #include "gui/widgets/text.h" 5 #include "gui/widgets/text.h"
6 #include "track/media.h" 6 #include "track/media.h"
7 #include "pugixml.hpp" 7
8 #include <QVBoxLayout> 8 #include <QVBoxLayout>
9 #include <QToolBar> 9 #include <QToolBar>
10 #include <QTreeView> 10 #include <QTreeView>
11 #include <QMainWindow> 11 #include <QMainWindow>
12 #include <QByteArray> 12 #include <QByteArray>
13 #include <QDataStream> 13 #include <QDataStream>
14 #include <QThreadPool> 14 #include <QThreadPool>
15 #include <QDebug> 15 #include <QDebug>
16
16 #include <iostream> 17 #include <iostream>
17 #include <sstream> 18 #include <sstream>
18 #include <algorithm> 19 #include <algorithm>
19 20
21 #include "pugixml.hpp"
20 #include "anitomy/anitomy.h" 22 #include "anitomy/anitomy.h"
21 23
22 /* This file is very, very similar to the anime list page. 24 /* This file is very, very similar to the anime list page.
23 25
24 It differs from Taiga in that it uses tabs instead of 26 It differs from Taiga in that it uses tabs instead of
50 52
51 QByteArray TorrentsPageListModel::DownloadTorrentList() { 53 QByteArray TorrentsPageListModel::DownloadTorrentList() {
52 return HTTP::Get(session.config.torrents.feed_link); 54 return HTTP::Get(session.config.torrents.feed_link);
53 } 55 }
54 56
57 void TorrentsPageListModel::ParseFeedDescription(const std::string& description, Torrent& torrent) {
58 /* Parse description... */
59 enum class Keys { SIZE, AUTHORIZED, SUBMITTER, COMMENT };
60
61 const std::unordered_map<std::string, Keys> KeyMap = {
62 {"Size", Keys::SIZE},
63 {"Authorized", Keys::AUTHORIZED},
64 {"Submitter", Keys::SUBMITTER},
65 {"Comment", Keys::COMMENT}
66 };
67
68 /* Parse size from description */
69 std::istringstream descstream(description);
70
71 for (std::string line; std::getline(descstream, line);) {
72 const size_t pos = line.find_first_of(':', 0);
73 if (pos == std::string::npos)
74 continue;
75
76 const std::string key = line.substr(0, pos);
77 const std::string value = line.substr(line.find_first_not_of(": ", pos));
78
79 switch (KeyMap.at(key)) {
80 case Keys::COMMENT:
81 torrent.SetDescription(value);
82 break;
83 case Keys::SIZE:
84 torrent.SetSize(Strings::HumanReadableSizeToBytes(value));
85 break;
86 default:
87 break;
88 }
89 }
90 }
91
55 void TorrentsPageListModel::ParseTorrentList(const QByteArray& ba) { 92 void TorrentsPageListModel::ParseTorrentList(const QByteArray& ba) {
56 std::istringstream stdstream(Strings::ToUtf8String(ba)); 93 std::istringstream stdstream(Strings::ToUtf8String(ba));
57 94
58 pugi::xml_document doc; 95 pugi::xml_document doc;
59 if (!doc.load(stdstream)) 96 if (!doc.load(stdstream))
82 torrent.SetTitle(Strings::ToUtf8String(elements.get(anitomy::kElementAnimeTitle))); 119 torrent.SetTitle(Strings::ToUtf8String(elements.get(anitomy::kElementAnimeTitle)));
83 torrent.SetEpisode(Strings::RemoveLeadingChars(Strings::ToUtf8String(elements.get(anitomy::kElementEpisodeNumber)), '0')); 120 torrent.SetEpisode(Strings::RemoveLeadingChars(Strings::ToUtf8String(elements.get(anitomy::kElementEpisodeNumber)), '0'));
84 torrent.SetGroup(Strings::ToUtf8String(elements.get(anitomy::kElementReleaseGroup))); 121 torrent.SetGroup(Strings::ToUtf8String(elements.get(anitomy::kElementReleaseGroup)));
85 torrent.SetResolution(Strings::ToUtf8String(elements.get(anitomy::kElementVideoResolution))); 122 torrent.SetResolution(Strings::ToUtf8String(elements.get(anitomy::kElementVideoResolution)));
86 } 123 }
87 torrent.SetDescription(Strings::TextifySynopsis(item.child_value("description"))); 124
88 { 125 ParseFeedDescription(Strings::TextifySynopsis(item.child_value("description")), torrent);
89 /* Parse description... */ 126
90 enum class Keys { SIZE, AUTHORIZED, SUBMITTER, COMMENT };
91
92 const std::unordered_map<std::string, Keys> KeyMap = {
93 {"Size", Keys::SIZE},
94 {"Authorized", Keys::AUTHORIZED},
95 {"Submitter", Keys::SUBMITTER},
96 {"Comment", Keys::COMMENT}
97 };
98
99 const std::string description = Strings::TextifySynopsis(item.child_value("description"));
100
101 /* Parse size from description */
102 std::istringstream descstream(description);
103
104 for (std::string line; std::getline(descstream, line);) {
105 const size_t pos = line.find_first_of(':', 0);
106 if (pos == std::string::npos)
107 continue;
108
109 const std::string key = line.substr(0, pos);
110 const std::string value = line.substr(line.find_first_not_of(": ", pos));
111
112 switch (KeyMap.at(key)) {
113 case Keys::COMMENT:
114 torrent.SetDescription(value);
115 break;
116 case Keys::SIZE:
117 torrent.SetSize(Strings::HumanReadableSizeToBytes(value));
118 break;
119 default:
120 break;
121 }
122 }
123 }
124 torrent.SetLink(item.child_value("link")); 127 torrent.SetLink(item.child_value("link"));
125 torrent.SetGuid(item.child_value("guid")); 128 torrent.SetGuid(item.child_value("guid"));
126 { 129 {
127 const QString date_str = Strings::ToQString(item.child_value("pubDate")); 130 const QString date_str = Strings::ToQString(item.child_value("pubDate"));
128 torrent.SetDate(QDateTime::fromString(date_str, "ddd, dd MMM yyyy HH:mm:ss t")); 131 torrent.SetDate(QDateTime::fromString(date_str, "ddd, dd MMM yyyy HH:mm:ss t"));