2023-02-23 22:50:30 +01:00
# The algorithm:
2022-12-21 23:46:14 +01:00
2023-02-23 22:50:30 +01:00
To retrieve the most YouTube video ids in order to retrieve the most video captions, we need to retrieve the most YouTube channels.
So to discover the YouTube channels graph with a breadth-first search, we proceed as follows:
1. Provide a starting set of channels.
2. Given a channel, retrieve other channels thanks to its content by using [YouTube Data API v3 ](https://developers.google.com/youtube/v3 ) and [YouTube operational API ](https://github.com/Benjamin-Loison/YouTube-operational-API ) and then repeat 1. for each retrieved channel.
2022-12-21 23:46:14 +01:00
2023-02-23 22:50:30 +01:00
A ready to be used by the end-user website instance of this project is hosted at: https://crawler.yt.lemnoslife.com
2022-12-21 23:46:14 +01:00
2023-02-23 22:50:30 +01:00
See more details on [the Wiki ](https://gitea.lemnoslife.com/Benjamin_Loison/YouTube_captions_search_engine/wiki ).
2023-02-23 23:12:18 +01:00
# Running the YouTube graph discovery algorithm:
2022-12-22 05:20:32 +01:00
2023-01-21 22:20:45 +01:00
Because of [the current compression mechanism ](https://gitea.lemnoslife.com/Benjamin_Loison/YouTube_captions_search_engine/issues/30 ), Linux is the only known OS able to run this algorithm.
2023-02-23 23:48:40 +01:00
To clone the repository, run:
```sh
git clone https://gitea.lemnoslife.com/Benjamin_Loison/YouTube_captions_search_engine
```
Move to the cloned repository by running:
```sh
cd YouTube_captions_search_engine/
```
2023-02-23 23:16:36 +01:00
To install the dependencies on an `apt` based Linux distribution of this project make sure to have [`pip` ](https://pip.pypa.io/en/stable/installation/ ) and run:
2023-02-23 23:12:18 +01:00
2022-12-22 05:20:32 +01:00
```sh
2023-02-23 23:16:36 +01:00
sudo apt install nlohmann-json3-dev
pip install yt-dlp
2023-02-23 23:12:18 +01:00
```
To compile the YouTube discovery graph algorithm, run:
```sh
2022-12-22 05:20:32 +01:00
make
2023-02-23 23:12:18 +01:00
```
To see the command line arguments of the algorithm, run:
```sh
Fix #13: Add captions extraction
I was about to commit in addition:
```c++
// Due to videos with automatically generated captions but being set to `Off` by default aren't retrieved with `--sub-langs '.*orig'`.
// My workaround is to first call YouTube Data API v3 Captions: list endpoint with `part=snippet` and retrieve the language that has `"trackKind": "asr"` (automatic speech recognition) in `snippet`.
/*json data = getJson(threadId, "captions?part=snippet&videoId=" + videoId, true, channelToTreat),
items = data["items"];
for(const auto& item : items)
{
json snippet = item["snippet"];
if(snippet["trackKind"] == "asr")
{
string language = snippet["language"];
cmd = cmdCommonPrefix + "--write-auto-subs --sub-langs '" + language + "-orig' --sub-format ttml --convert-subs vtt" + cmdCommonPostfix;
exec(threadId, cmd);
// As there should be a single automatic speech recognized track, there is no need to go through all tracks.
break;
}
}*/
```
Instead of:
```c++
cmd = cmdCommonPrefix + "--write-auto-subs --sub-langs '.*orig' --sub-format ttml --convert-subs vtt" + cmdCommonPostfix;
exec(threadId, cmd);
```
But I realized that, as the GitHub comment I was about to add to https://github.com/yt-dlp/yt-dlp/issues/2655, I was
wrong:
> `yt-dlp --cookies cookies.txt --sub-langs 'en.*,.*orig' --write-auto-subs https://www.youtube.com/watch?v=tQqDBySHYlc` work as expected. Many thanks again.
>
> ```
> 'subtitleslangs': ['en.*','.*orig'],
> 'writeautomaticsub': True,
> ```
>
> Work as expected too. Thank you
>
> Very sorry for the video sample. I even not watched it.
Thank you for this workaround. However note that videos having automatically generated subtitles but being set to `Off` by default aren't retrieved with your method (example of such video: [`mozyXsZJnQ4`](https://www.youtube.com/watch?v=mozyXsZJnQ4)). My workaround is to first call [YouTube Data API v3](https://developers.google.com/youtube/v3) [Captions: list](https://developers.google.com/youtube/v3/docs/captions/list) endpoint with [`part=snippet`](https://developers.google.com/youtube/v3/docs/captions/list#part) and retrieve the [`language`](https://developers.google.com/youtube/v3/docs/captions#snippet.language) that has [`"trackKind": "asr"`](https://developers.google.com/youtube/v3/docs/captions#snippet.trackKind) (automatic speech recognition) in [`snippet`](https://developers.google.com/youtube/v3/docs/captions#snippet).
2023-02-10 20:03:08 +01:00
./youtubeCaptionsSearchEngine -h
2023-01-15 02:19:31 +01:00
```
2023-02-23 23:12:18 +01:00
To run the YouTube discovery graph algorithm, run:
2023-02-14 01:32:36 +01:00
```sh
2023-02-23 23:12:18 +01:00
./youtubeCaptionsSearchEngine
2023-02-14 01:32:36 +01:00
```
2023-01-15 02:19:31 +01:00
Except if you provide the argument `--youtube-operational-api-instance-url https://yt.lemnoslife.com` , you have [to host your own instance of the YouTube operational API ](https://github.com/Benjamin-Loison/YouTube-operational-API/#install-your-own-instance-of-the-api ).
2023-01-22 15:41:13 +01:00
Except if you provide the argument `--no-keys` , you have to provide at least one [YouTube Data API v3 key ](https://developers.google.com/youtube/v3/getting-started ) in `keys.txt` .
2023-02-23 23:12:18 +01:00
# Hosting the website enabling users to make requests:
2023-02-23 23:48:40 +01:00
Move to the `website/` folder by running:
```sh
cd website/
```
2023-02-23 23:16:36 +01:00
To install its dependencies make sure to have [`composer` ](https://getcomposer.org/doc/00-intro.md ) installed and run:
2023-02-23 23:12:18 +01:00
2023-01-15 02:19:31 +01:00
```sh
2023-02-23 23:12:18 +01:00
composer install
pip install webvtt-py
```
Add the following configuration to your Nginx website one:
```nginx
# Make the default webpage of your website to be `index.php` .
index index.php;
# Allow end-users to retrieve the content of a file within a channel zip.
location /channels {
rewrite ^(.*).zip$ /channels.php;
rewrite ^(.*).zip/(.*).json$ /channels.php;
rewrite ^(.*).zip/(.*).txt$ /channels.php;
rewrite ^(.*).zip/(.*).vtt$ /channels.php;
# Allow end-users to list `channels/` content.
autoindex on;
}
# Disable end-users to access to other end-users requests.
location /users {
deny all;
}
# Configure the websocket endpoint.
location /websocket {
# switch off logging
access_log off;
# redirect all HTTP traffic to localhost
proxy_pass http://localhost:4430;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket support (nginx 1.4)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# timeout extension, possibly keep this short if using a ping strategy
proxy_read_timeout 99999s;
}
```
Start the websocket worker by running:
```sh
php websockets.php
2022-12-22 05:20:32 +01:00
```