Skip to content

Commit

Permalink
Merge branch 'windows-server-2003:main' into morelang
Browse files Browse the repository at this point in the history
  • Loading branch information
ItsFrocat authored Mar 8, 2024
2 parents 7791c3e + dc65af8 commit 7d841b4
Show file tree
Hide file tree
Showing 9 changed files with 89 additions and 52 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ ROMFS := romfs
LIBRARY := library
GFXBUILD := $(ROMFS)/gfx
#---------------------------------------------------------------------------------
APP_VER := 83
APP_VER := 84
APP_TITLE := ThirdTube
APP_DESCRIPTION := A YouTube client for the 3DS
APP_DESCRIPTION_JA := A YouTube client for the 3DS Japanese
Expand Down
41 changes: 20 additions & 21 deletions decrypter/0_latest.txt
Original file line number Diff line number Diff line change
@@ -1,30 +1,29 @@
# 19773
s 52
# 19788
s 43
R
c 3
s 45
R
s 53
c 3
R
c 1
s 29
s 15
c 2
>
r -1473906590
s 773462082
t ej4E 0aA-_
s -1777334819
r 78756329
e -1543798665
e -1553193953
R
r 1099802296
e 252625712
r -434708788
r 1320364804
s -1560567458
r 2013535546
R
s -787267704
e -302748668
e -2100786658
s 527271687
R
R
r 531841242
s 1875085766
r 65611864
R
r 1430129269
s 1333417834
t reverse 0aA-_
s 2134058804
r -1962687386
r 424664747
s 1793125897
s 491828204
r -1986790907
29 changes: 29 additions & 0 deletions decrypter/archive/0/19788.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# 19788
s 43
R
c 3
R
c 3
R
s 15
c 2
>
s -1777334819
r 78756329
e -1543798665
e -1553193953
R
r 2013535546
R
R
R
s 1875085766
r 65611864
R
t reverse 0aA-_
s 2134058804
r -1962687386
r 424664747
s 1793125897
s 491828204
r -1986790907
2 changes: 1 addition & 1 deletion source/definitions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#define DEF_SEND_APP_INFO_URL (std::string)"https://script.google.com/macros/s/AKfycbyn_blFyKWXCgJr6NIF8x6ETs7CHRN5FXKYEAAIrzV6jPYcCkI/exec"
#define DEF_CHECK_UPDATE_URL (std::string)"https://script.google.com/macros/s/AKfycbwTd3jzV0npUE9MNKmZIv3isazVR5D9_7A8rexsG1vr9SE7iavDBxgtzlph8dZipwu9/exec"
#define DEF_HTTP_USER_AGENT (std::string)"video player for 3ds v1.1.0"
#define DEF_CURRENT_APP_VER (std::string)"0.5.3"
#define DEF_CURRENT_APP_VER (std::string)"0.5.4"
#define DEF_CURRENT_APP_VER_INT 0
#define GITHUB_URL std::string("https://github.com/windows-server-2003/ThirdTube")

Expand Down
21 changes: 16 additions & 5 deletions source/youtube_parser/channel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,20 @@ static void parse_channel_data(RJson data, YouTubeChannelDetail &res) {

auto metadata_renderer = data["metadata"]["channelMetadataRenderer"];
res.name = metadata_renderer["title"].string_value();
res.subscriber_count_str = get_text_from_object(data["header"]["c4TabbedHeaderRenderer"]["subscriberCountText"]);
if (data["header"].has_key("c4TabbedHeaderRenderer")) {
res.subscriber_count_str = get_text_from_object(data["header"]["c4TabbedHeaderRenderer"]["subscriberCountText"]);
res.banner_url = get_thumbnail_url_exact(data["header"]["c4TabbedHeaderRenderer"]["banner"]["thumbnails"], 320);
res.icon_url = get_thumbnail_url_closest(data["header"]["c4TabbedHeaderRenderer"]["avatar"]["thumbnails"], 88);
} else {
auto model = data["header"]["pageHeaderRenderer"]["content"]["pageHeaderViewModel"];
res.banner_url = get_thumbnail_url_exact(model["banner"]["imageBannerViewModel"]["image"]["sources"], 320);
res.icon_url = get_thumbnail_url_closest(model["image"]["decoratedAvatarViewModel"]["avatar"]["avatarViewModel"]["image"]["sources"], 88);
auto tmp = model["metadata"]["contentMetadataViewModel"]["metadataRows"].array_items();
if (tmp.size()) {
tmp = tmp[0]["metadataParts"].array_items();
if (tmp.size() >= 2) res.subscriber_count_str = tmp[1]["text"]["content"].string_value();
}
}
res.id = metadata_renderer["externalId"].string_value();
res.url = "https://m.youtube.com/channel/" + metadata_renderer["externalId"].string_value();
res.description = metadata_renderer["description"].string_value();
Expand All @@ -40,8 +53,6 @@ static void parse_channel_data(RJson data, YouTubeChannelDetail &res) {
res.playlist_tab_params = tab["tabRenderer"]["endpoint"]["browseEndpoint"]["params"].string_value();
}
}
res.banner_url = get_thumbnail_url_exact(data["header"]["c4TabbedHeaderRenderer"]["banner"]["thumbnails"], 320);
res.icon_url = get_thumbnail_url_closest(data["header"]["c4TabbedHeaderRenderer"]["avatar"]["thumbnails"], 88);
}

YouTubeChannelDetail youtube_load_channel_page(std::string url_or_id) {
Expand Down Expand Up @@ -86,7 +97,7 @@ YouTubeChannelDetail youtube_load_channel_page(std::string url_or_id) {
std::string &id = url_or_id;
res.url_original = "https://m.youtube.com/channel/" + id;

std::string post_content = R"({"context": {"client": {"hl": "%0", "gl": "%1", "clientName": "MWEB", "clientVersion": "2.20210711.08.00"}}, "browseId": "%2", "params":"EgZ2aWRlb3M%3D"})";
std::string post_content = R"({"context": {"client": {"hl": "%0", "gl": "%1", "clientName": "MWEB", "clientVersion": "2.20240304.08.00"}}, "browseId": "%2", "params":"EgZ2aWRlb3PyBgQKAjoA"})";
post_content = std::regex_replace(post_content, std::regex("%0"), language_code);
post_content = std::regex_replace(post_content, std::regex("%1"), country_code);
post_content = std::regex_replace(post_content, std::regex("%2"), id);
Expand Down Expand Up @@ -117,7 +128,7 @@ std::vector<YouTubeChannelDetail> youtube_load_channel_page_multi(std::vector<st
int n = ids.size();
int finished = 0;
for (int i = 0; i < n; i++) {
std::string post_content = R"({"context": {"client": {"hl": "%0", "gl": "%1", "clientName": "MWEB", "clientVersion": "2.20210711.08.00"}}, "browseId": "%2", "params":"EgZ2aWRlb3M%3D"})";
std::string post_content = R"({"context": {"client": {"hl": "%0", "gl": "%1", "clientName": "MWEB", "clientVersion": "2.20210711.08.00"}}, "browseId": "%2", "params":"EgZ2aWRlb3PyBgQKAjoA"})";
post_content = std::regex_replace(post_content, std::regex("%0"), language_code);
post_content = std::regex_replace(post_content, std::regex("%1"), country_code);
post_content = std::regex_replace(post_content, std::regex("%2"), ids[i]);
Expand Down
22 changes: 13 additions & 9 deletions source/youtube_parser/home.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
YouTubeHomeResult youtube_load_home_page() {
YouTubeHomeResult res;

std::string post_content = R"({"context": {"client": {"hl": "$0", "gl": "$1", "clientName": "MWEB", "clientVersion": "2.20220407.00.00"}}, "browseId": "FEwhat_to_watch"})";
std::string post_content = R"({"context": {"client": {"hl": "$0", "gl": "$1", "clientName": "MWEB", "clientVersion": "2.20220407.00.00"}}, "browseId": "FEtrending"})";
post_content = std::regex_replace(post_content, std::regex("\\$0"), language_code);
post_content = std::regex_replace(post_content, std::regex("\\$1"), country_code);

Expand All @@ -14,10 +14,12 @@ YouTubeHomeResult youtube_load_home_page() {
[&] (Document &, RJson yt_result) {
res.visitor_data = yt_result["responseContext"]["visitorData"].string_value();
for (auto tab : yt_result["contents"]["singleColumnBrowseResultsRenderer"]["tabs"].array_items()) {
for (auto item : tab["tabRenderer"]["content"]["richGridRenderer"]["contents"].array_items()) {
if (item.has_key("richItemRenderer")) res.videos.push_back(parse_succinct_video(item["richItemRenderer"]["content"]["videoWithContextRenderer"]));
if (item.has_key("continuationItemRenderer"))
res.continue_token = item["continuationItemRenderer"]["continuationEndpoint"]["continuationCommand"]["token"].string_value();
for (auto section : tab["tabRenderer"]["content"]["sectionListRenderer"]["contents"].array_items()) {
if (section.has_key("continuationItemRenderer"))
res.continue_token = section["continuationItemRenderer"]["continuationEndpoint"]["continuationCommand"]["token"].string_value();
for (auto item : section["itemSectionRenderer"]["contents"].array_items()) {
if (item.has_key("videoWithContextRenderer")) res.videos.push_back(parse_succinct_video(item["videoWithContextRenderer"]));
}
}
}
},
Expand Down Expand Up @@ -50,10 +52,12 @@ void YouTubeHomeResult::load_more_results() {
[&] (Document &, RJson yt_result) {
if (yt_result["responseContext"]["visitorData"].string_value() != "") visitor_data = yt_result["responseContext"]["visitorData"].string_value();
for (auto action : yt_result["onResponseReceivedActions"].array_items()) {
for (auto item : action["appendContinuationItemsAction"]["continuationItems"].array_items()) {
if (item.has_key("richItemRenderer")) videos.push_back(parse_succinct_video(item["richItemRenderer"]["content"]["videoWithContextRenderer"]));
if (item.has_key("continuationItemRenderer"))
continue_token = item["continuationItemRenderer"]["continuationEndpoint"]["continuationCommand"]["token"].string_value();
for (auto section : action["appendContinuationItemsAction"]["continuationItems"].array_items()) {
if (section.has_key("continuationItemRenderer"))
continue_token = section["continuationItemRenderer"]["continuationEndpoint"]["continuationCommand"]["token"].string_value();
for (auto item : section["itemSectionRenderer"]["contents"].array_items()) {
if (item.has_key("videoWithContextRenderer")) videos.push_back(parse_succinct_video(item["videoWithContextRenderer"]));
}
}
}
},
Expand Down
3 changes: 1 addition & 2 deletions source/youtube_parser/parser.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ struct YouTubeSuccinctItem {

struct YouTubeSearchResult {
std::string error;
int estimated_result_num;
std::string estimated_result_num;
std::vector<YouTubeSuccinctItem> results;

std::string continue_token;
Expand Down Expand Up @@ -91,7 +91,6 @@ struct YouTubeVideoDetail {
std::string views_str;

// caption-related data
std::string caption_base_url;
struct CaptionBaseLanguage {
std::string name; // e.g. "English", "Japanese"
std::string id; // e.g. "en", "ja"
Expand Down
4 changes: 2 additions & 2 deletions source/youtube_parser/search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ YouTubeSearchResult youtube_load_search(std::string url) {
access_and_parse_json(
[&] () { return http_post_json(get_innertube_api_url("search"), post_content); },
[&] (Document &, RJson yt_result) {
res.estimated_result_num = std::stoll(yt_result["estimatedResults"].string_value());
res.estimated_result_num = yt_result["estimatedResults"].string_value();
res.continue_token = "";
for (auto i : yt_result["contents"]["sectionListRenderer"]["contents"].array_items()) {
if (i.has_key("itemSectionRenderer"))
Expand Down Expand Up @@ -112,7 +112,7 @@ void YouTubeSearchResult::load_more_results() {
access_and_parse_json(
[&] () { return http_post_json(get_innertube_api_url("search"), post_content); },
[&] (Document &, RJson yt_result) {
estimated_result_num = std::stoll(yt_result["estimatedResults"].string_value());
estimated_result_num = yt_result["estimatedResults"].string_value();
continue_token = "";
for (auto i : yt_result["onResponseReceivedCommands"].array_items()) {
for (auto j : i["appendContinuationItemsAction"]["continuationItems"].array_items()) {
Expand Down
17 changes: 6 additions & 11 deletions source/youtube_parser/video.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ static void extract_like_dislike_counts(RJson buttons, YouTubeVideoDetail &res)
else if (button["slimMetadataToggleButtonRenderer"]["isDislike"].bool_value()) res.dislike_count_str = content;
if (button["slimMetadataToggleButtonRenderer"]["target"]["videoId"].is_valid()) res.id = button["slimMetadataToggleButtonRenderer"]["target"]["videoId"].string_value();
}
if (button["slimMetadataButtonRenderer"]["button"].has_key("segmentedLikeDislikeButtonRenderer")) {
if (button["slimMetadataButtonRenderer"]["button"].has_key("segmentedLikeDislikeButtonRenderer")) { // old?
auto renderer = button["slimMetadataButtonRenderer"]["button"]["segmentedLikeDislikeButtonRenderer"];
auto get_text = [] (RJson button) -> std::string {
auto text = get_text_from_object(button["toggleButtonRenderer"]["defaultText"]);
Expand All @@ -133,6 +133,11 @@ static void extract_like_dislike_counts(RJson buttons, YouTubeVideoDetail &res)
res.like_count_str = get_text(renderer["likeButton"]);
res.dislike_count_str = get_text(renderer["dislikeButton"]);
}
if (button["slimMetadataButtonRenderer"]["button"].has_key("segmentedLikeDislikeButtonViewModel")) {
res.like_count_str = button["slimMetadataButtonRenderer"]["button"]["segmentedLikeDislikeButtonViewModel"]["likeButtonViewModel"]
["likeButtonViewModel"]["toggleButtonViewModel"]["toggleButtonViewModel"]["defaultButtonViewModel"]["buttonViewModel"]["title"].string_value();
if (res.like_count_str.size() && !isdigit(res.like_count_str[0])) res.like_count_str = "hidden";
}
}
}

Expand Down Expand Up @@ -311,16 +316,6 @@ YouTubeVideoDetail youtube_load_video_page(std::string url) {
);
}
# endif

# ifdef _WIN32
// for debug purpose, to check whether the extracted stream url is working
if (res.audio_stream_url != "") {
auto tmp_data = http_get(res.audio_stream_url + "&range=0-400000").second;
if (tmp_data.size() != 400001) {
debug_error("!!!!!!!!!!!!!!!!!!!!! SIZE DIFFER : " + std::to_string(tmp_data.size()) + " !!!!!!!!!!!!!!!!!!!!!");
} else debug_info("----------------------- OK -----------------------");
} else debug_error("!!!!!!!!!!!!!!!!!!!!! AUDIO STREAM URL EMPTY !!!!!!!!!!!!!!!!!!!!!");
# endif

if (res.id != "") res.succinct_thumbnail_url = youtube_get_video_thumbnail_url_by_id(res.id);
# ifndef _WIN32
Expand Down

0 comments on commit 7d841b4

Please sign in to comment.