Skip to content
This repository was archived by the owner on Nov 27, 2024. It is now read-only.

Major Rewrite aka V2 #45

Merged
merged 110 commits into from
May 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
110 commits
Select commit Hold shift + click to select a range
17ad6bf
Update mobile app versions & bump version
kuylar Mar 9, 2024
cd1d93f
...bump version
kuylar Mar 9, 2024
d96dcf3
Update android player params
kuylar Apr 2, 2024
48428ff
Merge branch 'master' into master
kuylar Apr 2, 2024
5046c53
Delete old files, we're starting from scratch
kuylar Dec 28, 2023
cb807cf
Protobuf conversion day 1
kuylar Dec 30, 2023
9142071
forgot to add these lol
kuylar Dec 30, 2023
8b4e93b
Implement more protobuf stuff in PlayerResponse
kuylar Jan 10, 2024
02b47c5
Tidy up URL creation
kuylar Jan 12, 2024
2676c3f
Merge WEB and ANDROID responses together
kuylar Jan 12, 2024
c97fdd3
Always include HLS in responses
kuylar Jan 12, 2024
200f751
Impement player errors
kuylar Jan 12, 2024
e33f46b
Implement all required player protobuf messages
kuylar Jan 12, 2024
4673d05
Fix error messages not appearing in PlayerException
kuylar Jan 26, 2024
f094429
Fix PlayerResponse package
kuylar Jan 26, 2024
52851eb
Re-implement caching
kuylar Jan 26, 2024
c992d61
Update comment
kuylar Jan 26, 2024
15013c2
Try to improve performance
kuylar Jan 26, 2024
6aa038c
implement a bit of /next protobuf
kuylar Jan 26, 2024
57013aa
implement videoSecondaryInfoRenderer
kuylar Feb 3, 2024
3e1bfc3
finish /next protobuf
kuylar Feb 19, 2024
0b2c0fb
Build protobuf files again, just because
kuylar Feb 19, 2024
b8613dd
fix protobuf usings
kuylar Feb 20, 2024
52256b7
Parse video info in code
kuylar Feb 25, 2024
d5586a2
Serialize renderers for tests
kuylar Feb 25, 2024
bc54862
Fix for videos with null description
kuylar Feb 25, 2024
4ee8fd5
Fix videos without watch next results
kuylar Feb 25, 2024
2df3f2c
Implement chapters
kuylar Feb 25, 2024
b1d4e8d
Fix livestreams in recommendations
kuylar Feb 25, 2024
08f58b2
didnt mean to commit that lol
kuylar Feb 25, 2024
907da80
add more renderers
kuylar Feb 27, 2024
5d5b6b9
MORE RENDERERS
kuylar Feb 27, 2024
999f4ad
add compactradiorenderer
kuylar Mar 5, 2024
3b01fc8
Add compactMovieRenderer
kuylar Mar 5, 2024
e895ba0
add missing fields
kuylar Mar 5, 2024
281bcd1
Implement playlists
kuylar Mar 7, 2024
407ed06
Implement exceptions for the /next endpoin
kuylar Mar 7, 2024
e6d256e
Update client versions to not get 404s
kuylar Mar 7, 2024
71b887a
Throw everything into a single protobuf file
kuylar Mar 7, 2024
8bc5dbc
Comments
kuylar Mar 7, 2024
9cde547
comment continuation
kuylar Mar 8, 2024
92b1af9
Implement exceptions for comments
kuylar Mar 8, 2024
87763c8
Use TestName instead of Description
kuylar Mar 29, 2024
2c6fa3b
Implement searching
kuylar Mar 31, 2024
af8c278
Implement renderers for the search endpoint
kuylar Apr 13, 2024
d8e9065
meant to do this long ago
kuylar Apr 15, 2024
1c504b3
Implement missing renderers for search, add tests
kuylar Apr 15, 2024
c5be457
"implement" the ad renderers
kuylar Apr 15, 2024
29058e6
Add test files to .gitignore
kuylar Apr 15, 2024
d238b63
why did i commit this
kuylar Apr 15, 2024
975b609
recompile protobufs
kuylar Apr 15, 2024
a31ea9b
fix the attributes
kuylar Apr 15, 2024
34e30dd
Make sure we parsed everything in the search response
kuylar Apr 15, 2024
6d2ab3c
Parse the second column of the search result
kuylar Apr 15, 2024
c6d1c2a
Add all parts of the sidebar to the test output
kuylar Apr 15, 2024
7c00cda
Search continuation
kuylar Apr 15, 2024
c269a19
didnt mean to commit that lol
kuylar Apr 15, 2024
43d27f4
Implement browse requests (to some extent)
kuylar Apr 15, 2024
0f17349
implement some channel-related renderers
kuylar Apr 15, 2024
c89f46b
Complete channel test output
kuylar Apr 16, 2024
2099add
Finish player tests
kuylar Apr 16, 2024
7dc5cab
Channel continuations
kuylar Apr 16, 2024
8c5bb4d
Tab switching for channels
kuylar Apr 16, 2024
3412a42
playlists
kuylar Apr 20, 2024
8602675
Make sure playlist continuations work
kuylar Apr 21, 2024
bad7de0
Implement renderers for FE******* browseIDs
kuylar Apr 21, 2024
8e404e7
Start implementing SimpleInnerTubeClient
kuylar Apr 22, 2024
79a689f
Fix missing fields in player_response
kuylar Apr 24, 2024
884258b
Implement signature deciphering
kuylar Apr 24, 2024
2479d01
Implement /next for SimpleInnerTubeClient
kuylar Apr 28, 2024
4be2805
fix stupidity
kuylar Apr 28, 2024
c054f55
Fix live storyboard specs
kuylar Apr 28, 2024
bb31180
Implement some renderer conversion
kuylar Apr 28, 2024
3ccc81f
Update ReadAttributedDescription
kuylar Apr 28, 2024
16d119a
Add PlaylistVideoRendererData
kuylar Apr 28, 2024
e53ee04
remove horrible, disgusting code
kuylar Apr 28, 2024
dbcf449
convert regex to GeneratedRegex
kuylar Apr 28, 2024
d91b816
Implement continuation renderers
kuylar Apr 28, 2024
ccedf76
Implement video continuation
kuylar Apr 28, 2024
2e2d576
someone forgot to add the protobuf messages for comments
kuylar Apr 29, 2024
e2b4c47
Comments
kuylar Apr 29, 2024
b9d7400
Update comments to not explode
kuylar Apr 30, 2024
2f89fc3
ok rider shut up
kuylar Apr 30, 2024
8414351
Add channels
kuylar May 3, 2024
926b6a0
channels, sorta
kuylar May 6, 2024
0810df7
finish channels
kuylar May 7, 2024
6064283
forgot to escape that lol
kuylar May 7, 2024
642e56f
playlists
kuylar May 7, 2024
e3337fe
Implement search
kuylar May 7, 2024
7fe518b
implement search?
kuylar May 9, 2024
d0eccfb
Start working on value parsers
kuylar May 9, 2024
013859d
Implement tests
kuylar May 9, 2024
6c1353f
Forgot to get last updated dates
kuylar May 9, 2024
9bbd4ab
Add last updated dates to the gist
kuylar May 9, 2024
2e151b8
Implement english value parser
kuylar May 9, 2024
46ed316
Make test results look prettier
kuylar May 9, 2024
88356a9
Implement en-GB
kuylar May 9, 2024
c780afc
Implement en-IN
kuylar May 9, 2024
6dfb40b
Implement tr
kuylar May 9, 2024
6fc0508
Implement az
kuylar May 9, 2024
6086749
Update test values
kuylar May 9, 2024
fa061f1
Update ParseVideoUploadType in Turkish
kuylar May 9, 2024
16f754b
Implement tests for relative dates
kuylar May 11, 2024
fbb4244
Implement relative date parser for tr
kuylar May 11, 2024
7cc8288
Add fail notifications
kuylar May 11, 2024
9c953ef
Implement relative date parser for az
kuylar May 11, 2024
4653dc3
Implement ja
kuylar May 11, 2024
330a1fe
Implement ko
kuylar May 11, 2024
ba0fc1c
Implement chinese languages
kuylar May 11, 2024
eb81136
Merge branch 'v2' into v2
kuylar May 17, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@ obj/
riderModule.iml
/_ReSharper.Caches/
.idea
*.DotSettings*
*.DotSettings*
Protobuf/*.bin
Protobuf/*.json
14 changes: 14 additions & 0 deletions InnerTube.Parsers.GetTestData/InnerTube.Parsers.GetTestData.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\InnerTube\InnerTube.csproj" />
</ItemGroup>

</Project>
130 changes: 130 additions & 0 deletions InnerTube.Parsers.GetTestData/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
using System.Text.Json;
using Google.Protobuf.Collections;
using InnerTube;
using InnerTube.Models;
using InnerTube.Protobuf;
using InnerTube.Protobuf.Responses;

string[] languages =
[
"af", "az", "id", "ms", "bs", "ca", "cs", "da", "de", "et", "en-IN", "en-GB", "en", "es", "es-419", "es-US",
"eu", "fil", "fr", "fr-CA", "gl", "hr", "zu", "is", "it", "sw", "lv", "lt", "hu", "nl", "no", "uz", "pl",
"pt-PT", "pt", "ro", "sq", "sk", "sl", "sr-Latn", "fi", "sv", "vi", "tr", "be", "bg", "ky", "kk", "mk", "mn",
"ru", "sr", "uk", "el", "hy", "iw", "ur", "ar", "fa", "ne", "mr", "hi", "as", "bn", "pa", "gu", "or", "ta",
"te", "kn", "ml", "si", "th", "lo", "my", "ka", "am", "km", "zh-CN", "zh-TW", "zh-HK", "ja", "ko"
];

string[] channels =
[
"UCX6OQ3DkcsbYNE6H8uQQuVA", // million subscribers
"UCbKWv2x9t6u8yZoB3KcPtnw", // million subscribers, 1 decimal
"UCS0N5baNlQWJCUrhCEo8WlA", // million subscribers, 2 decimal
"UCB5zZAm0b5-EqWkOEwHBE_A", // thousand subscribers
"UCjdHbo8_vh3rxQ-875XGkvw", // thousand subscribers, 1 decimal
// TODO: "", // thousand subscribers, 2 decimal
"UCRS3ZUNqkEyTd9XZEphFRMA", // hundred subscribers
];

string[] videos =
[
"Atvsg_zogxo", // Premiered
"jfKfPfyJRdk", // Streaming
"dv_YFDzCw2s", // Streamed
"7DKv5H5Frt0", // Published
];

string[] playlists =
[
"VLPLiDvcIUGEFPv2K8h3SRrpc7FN7Ks0Z_A7",
"VLPLWA4fx92eWNstZbKK52BK9Ox-I4KvxdkF"
];

// todo: remember to borrow dates from https://github.com/TeamNewPipe/NewPipeExtractor/blob/dev/timeago-parser/raw/overview.json

InnerTube.InnerTube client = new();

Dictionary<string, Dictionary<string, List<string>>> finalResult = [];

for (int i = 0; i < languages.Length; i++)
{
string hl = languages[i];
Console.Write($"[{i + 1,2}/{languages.Length}] Getting data for {$"'{hl}'",-9}");

List<string> subscriberCounts = [];
List<string> videoDates = [];
List<string> viewCounts = [];
List<string> likeCounts = [];
List<string> lastUpdatedDates = [];

Task[] channelTasks = channels.Select(channelId => GetSubscriptionCount(hl, channelId)).Cast<Task>().ToArray();
await Task.WhenAll(channelTasks);
subscriberCounts.AddRange(from Task<string> res in channelTasks select res.Result);

Task[] videoTasks = videos.Select(videoId => GetVideoStrings(hl, videoId)).Cast<Task>().ToArray();
await Task.WhenAll(videoTasks);
videoDates.AddRange(from Task<(string, string, string)> res in videoTasks select res.Result.Item1);
viewCounts.AddRange(from Task<(string, string, string)> res in videoTasks select res.Result.Item2);
likeCounts.AddRange(from Task<(string, string, string)> res in videoTasks select res.Result.Item3);

Task[] playlistTasks = playlists.Select(playlistId => GetLastUpdated(hl, playlistId)).Cast<Task>().ToArray();
await Task.WhenAll(playlistTasks);
lastUpdatedDates.AddRange(from Task<string> res in playlistTasks select res.Result);

Console.Write("\n");
Dictionary<string, List<string>> languageResult = new()
{
["subscriberCounts"] = subscriberCounts,
["videoDates"] = videoDates,
["viewCounts"] = viewCounts,
["likeCounts"] = likeCounts,
["lastUpdatedDates"] = lastUpdatedDates,
};

finalResult.Add(hl, languageResult);
}

string json = JsonSerializer.Serialize(finalResult);
File.WriteAllText($"out.{DateTimeOffset.Now:s}.json", json);

return;

async Task<string> GetSubscriptionCount(string hl, string channelId)
{
BrowseResponse channel = await client.BrowseAsync(channelId, language: hl);
string subscriberCountText = (channel.Header.RendererCase switch
{
RendererWrapper.RendererOneofCase.C4TabbedHeaderRenderer => new ChannelHeader(channel.Header
.C4TabbedHeaderRenderer),
RendererWrapper.RendererOneofCase.PageHeaderRenderer => new ChannelHeader(
channel.Header.PageHeaderRenderer,
channel.Metadata.ChannelMetadataRenderer.ExternalId),
_ => null
})!.SubscriberCountText;
Console.Write(".");
return subscriberCountText;
}

async Task<(string, string, string)> GetVideoStrings(string hl, string videoId)
{
NextResponse next = await client.GetNextAsync(videoId, language: hl);
RepeatedField<RendererWrapper> firstColumnResults =
next.Contents.TwoColumnWatchNextResults.Results.ResultsContainer.Results;
VideoPrimaryInfoRenderer videoPrimaryInfoRenderer = firstColumnResults.First(x =>
x.RendererCase == RendererWrapper.RendererOneofCase.VideoPrimaryInfoRenderer).VideoPrimaryInfoRenderer;
string dateText = Utils.ReadRuns(videoPrimaryInfoRenderer.DateText);
string viewCountText = Utils.ReadRuns(videoPrimaryInfoRenderer.ViewCount?.VideoViewCountRenderer.ViewCount);
string likeCountText = videoPrimaryInfoRenderer.VideoActions.MenuRenderer.TopLevelButtons
.First(x => x.RendererCase == RendererWrapper.RendererOneofCase.SegmentedLikeDislikeButtonViewModel)
.SegmentedLikeDislikeButtonViewModel.LikeButtonViewModel.LikeButtonViewModel.ToggleButtonViewModel
.ToggleButtonViewModel.DefaultButtonViewModel.ButtonViewModel2.Title;
Console.Write(",");
return (dateText, viewCountText, likeCountText);
}

async Task<string> GetLastUpdated(string hl, string playlistId)
{
BrowseResponse browse = await client.BrowseAsync(playlistId, language: hl);
string lastUpdated = Utils.ReadRuns(browse.Header.PlaylistHeaderRenderer.Byline.PlaylistBylineRenderer.Text.Last());
Console.Write(";");
return lastUpdated;
}
43 changes: 0 additions & 43 deletions InnerTube.Tests/AuthenticationTests.cs

This file was deleted.

Loading