แจแแกแแแแแ แแแแแแ: แแ แแแแแ แแแกแแฃแแ แ YouTube แแแแแแ แแแแแ แแ Android-แแกแแแแก แแแแแแแแ แแแ แแแกแแแ แแแ แกแแแแแ, แแ แฎแแแแ แแ แ แแแแแแแแแชแแแแแ.
แแแคแแ แแแแแฃแแ แจแแกแแแแแ:
แ แแแแแแแแ แฎแแแก แฌแแ แแฃแกแขแแ แแแแแ แแ แแแแแแแก แฌแแแแฌแงแแ, แ แแช แแจแแแแแแ แ แแแแแแแชแแแก แแแขแแ แก
แกแแแฌแฃแฎแแ แแ, Channel Whitelist แแแแแแแชแแแก แแแงแแแแแแก แจแแแแแ, แแแแแ แแ แแ แฃแคแ แ แแ แแแแฃแแ, แแแแ แแ แแแแแช แคแแขแแแฃแ แ แฎแแ แแแแ แแฆแแแแฉแแแแก - NIH I-แ (แแ, แ แแช แแแแแแ แแ, แฉแแแก แจแแแแก) แแแกแ แแแขแแ แคแแแกแ แแ แช แแฃ แแกแ แแแกแแฎแแ แฎแแแแแ แแฆแแแฉแแแ, แแแแกแแแฃแแ แแแแ YouTube Kids-แแก แแแแแ แแก แแแแแงแแแแแแก แฉแแแแแก แจแแแแแ.
แแแแแแแ, แแแ แแแแฃแแ แแแ แแแแแก แจแแแแแ แแแแ แแแงแแแ แกแแแฃแแแ แ แแแแฎแแ แชแแแแแแแกแแแแก. แแแ แแแแฃแแ แแแ แแแแแก แจแแแแแ, แจแแกแแซแแแแแแ แแแฎแแ แขแแแแก แแแงแแแแแ แแแ แแแ แแแแแจแแแแแแ.
แซแแ แแแแแ แแแฎแแกแแแแแแแแแ:
- แแแแแแขแแ แแฅแแแแ แกแแงแแแ แแแ แแ แฎแแแ แแ แแแกแแแ แแแ แกแแแแ - แแกแแแ แจแแแแแฎแแแ แแ แแแแแฅแกแแ แแแฃแแ แแฅแแแแ แแแแแแแแ แแ แแแแแชแแแแ แแแแแจแ
- แแแแแขแแแฃแ แแแกแแแ แแ แกแแแแจแ, แแแแแ แแแ แแ แแกแแญแแ แ แแแแแแแแ, แแฃ แแกแแแ แแ แแญแแ แแแแแ
- แ แแแแแแแแแชแแแแแก แกแแ แแแแแ แแ แแแแ แจแแแแฎแแแแแ แแฎแแแแ แแแแแแแชแแแจแ แแแแแขแแแฃแแ แแ แฎแแแแแแ แแ แแแกแแแ แแแ แกแแแแแแแ
แฆแแ แฌแงแแ แ, GPLv3 แแแชแแแแแ:
แฅแแแแแ แแแชแแแฃแแแ แซแแ แแแแแ แคแฃแแฅแชแแแแแก แแแแแฎแแแแ แฃแคแ แ แแแขแแแฃแ แแ, แแกแแแ แ แแแแแแแแ แขแแฅแแแแฃแ แ แแแขแแแ แแแแก แจแแกแแฎแแ, แแฃ แ แแแแ แฃแแแ แแแแแ แ YouTube แแแแแแแแ แแฅแแแแก Android แแแแแแแชแแแจแ Google API-แแกแ แแ แแแ แจแแคแฃแแแแแแก แแแแแงแแแแแแก แแแ แแจแ.
แแแแแแ แแแ แแแแ แแ แแแแแแแจแแก แแแ แแแแ: แจแแแแฎแแแแแแ แ แแแแแแแแแชแแแแ แแ แ แจแแแแฎแแแแแแ แแ แฎแแแแแแ
แแงแแกแแแ แ แซแแแแ แแแแแแแแ แแ แแแแแชแแแแ แแแแแจแ
แแแแแแขแแ แแฎแแแ แแ แฎแ แแ แแแกแแแ แแแ แกแแ
แแแซแแแแแ แกแแฎแแแแ แแแแแแ แแ แฉแแแแ แชแแแแแแ แแแกแแแแ แแ. แแ แฎแแก แแ แแแกแแแ แแแ แกแแแก แแแแแแแแแก แกแแ แจแแแแฎแฃแแแ แแแแแแแแ แแ แแแแแชแแแแ แแแแแจแ; แฎแแขแแแ แแ แแ แแก แฅแแจแแ แแแฃแแ.
แแแแแแแฃแ แ แแแกแแแ แแแ แกแแ - แซแแแแแก แจแแแแแแแแก แแแแแ แ
แแแแแ แ แแแแแแแแแชแแแแจแ แแฅแแแแ แแฎแแแแ แแแแแแแแ, แ แแแแแแแช แแแแแงแแคแแแแแแ แกแแซแแแแ แแแแฎแแแแแก.
แแแแแแแแฃแ แแ, แแฃ แแฅแแแ แแแฎแกแแแ แแแแแแก แแแกแแแ แแแ แกแแแก แแแ แแแแขแ แแแแแแ, แ แแแแแแแแแชแแแแแก แกแแแจแ แแแแแฉแแแแแ แแฎแแแแ แแแแแแแแ แแแแแ แแแกแแแ แแแ แกแแแแแ.
แแแกแแแ แแแ แกแแแแ แแ แแ แฎแแแ แจแแแซแแแแ แแ แแแแแ แแแแแ แแแ แแ แฎแแแแฎแแ แฉแแ แแแ
แแแฎแแแ แแแแแแแแแกแฌแแแแ: แแแแแแแแ แแแแแ แแฃแแ แแแกแแแ แแแ แกแแแแแ แแกแแแ แแแฅแ แแแ แซแแแแแก แจแแแแแแแแแแ, แแแฎแแแก แแกแขแแ แแแแแ แแ แคแแแแ แแขแแแแก แกแแแแแ. แแแแ แแ แแ แแแแ แแแฃแแแ, แแกแแแ แแแแแ แแแแแฉแแแแแ แแฅ, แแแกแแแ แแแ แกแแแก แฎแแแแฎแแ แฉแแ แแแแกแแแแแแ.
แแแแแแขแแ แแแแแ แจแแ แกแแแจแ
แแแแแแแแแ แแแแแ แแ แแแแแฉแแแแแ แ แแแแแแแแแชแแแแจแ, แซแแแแแก แจแแแแแแแจแ แแ แแแฅแ แแแ แคแแแแ แแขแแแแก แกแแแแแ แแ แแแฎแแแก แแกแขแแ แแแแแ. แแแแแ แแแแแ แแแแแฉแแแแแ แแแกแแแ แแแ แกแแแก แแแ แแแแขแ แแแจแ.
แแแฎแแ แจแแแ แกแแ แแ แฎแแแแฎแแ แฉแแ แแแ แจแแชแแแแแ แแแแแแแแแ แแแแแแแขแแแ:
แแแ แแแแขแ แแแ > แกแแแแฃแ แแก แแแแแฃ > แจแแแ แกแแ
แกแแงแแแ แแแ แแแแแแแแ แแ แแแฎแแแก แแกแขแแ แแ
แคแแแแ แแขแ แแแแแแแแ แแแแแแแจแแก แแแ แแแแ แแฆแแแแจแแแแ แแแ แกแแแแแแแ แแแแ แแแ แฏแแแแ แแฃแแฎแแจแ.
แแแแขแแฅแกแขแฃแ แ แแแแแฃแแแ แแแ แแแแก แกแแแแฃแ แจแ แแ แแแแฎแแแก แแแแฌแแแแฃแแแ แแแแแ แแแแกแ แแ แกแแแแจแ
แแแแแแแแ แแ แแแแแแก แแ แแแกแแแ แแแ แกแแแก แกแแฎแแแ แแ แแแกแแแแ แแ แกแแแแฎแแ แแแ แแแแ แแ แแแแแกแแแแ แกแแแจแ.
แกแฌแ แแคแ แแแฌแงแแแ - แแแแแแขแแ แ แแแแแแแแแแฃแแ แแ แฎแแแ แแ แแแกแแแ แแแ แกแแแแ
แแแแแแแชแแ แแแจแแแแ แแแแแกแแแแกแแแ แแแแแ แแแชแแแฃแ แแแ แแแแก แกแฃแ แแแแแก.
แแ แแกแแญแแ แ แแ แฎแแแ แแ แแแกแแแ แแแ แกแแแแ แจแแแซแแแแ แแแแแ แแแ แแ แฌแแจแแแแ แแแ แแแแขแ แแแจแ.
แแแงแแแแแแก
แแ แแแฅแขแแก แแแแ แแ:
แแแแแแกแฃแ แแ:
แ แแแแแแแ:
- แแก แแ แแ แแก Google Play-แแ แแ แแ แช แแฅแแแแ แฃแแฎแแแแก แแแแแแแแจแ (Google แแ แซแแแแแก แแแแแแแชแแแแก, แ แแแแแแแช แแแแ แแก แฃแแแแแ API-แก แแ แแแแแแแแแแแ แแแ แแแแกแแแขแก, แแแ แจแแ แแก แแฆแแแจแแฃแแ แแ แฎแแก แแแแ แ แกแแแก แแ NewPipe แแแแแ แแก แฉแแแแแแ)
- แแจแแแแแ แฌแงแแ แแแแแแแ:
https://github.com/sadr0b0t/yashlang/ - แฉแแแแขแแแ แแแ apk แแแแแจแแแแแก แแแแงแแคแแแแแแแแ:
https://github.com/sadr0b0t/yashlang/releases - แแแแแแ แแแขแแแแแจแ แแแ แแแแฃแแ แแ แแแก แจแแแแแ แแแแแฉแแแแแ
F-Droid (แ แแแแ แช แฉแแแก, แแแแแขแแแแก แแแแแชแฎแแแ แแแแขแแแชแแแฃแแแ , แแแแ แแ แแ แแแแแกแฃแแ แแแแฅแแแก แแ แแ แแแ), แแแแ แแ แฏแแ แแ แ
แแแแแแแแแกแฌแแแแ, แ แแ แแ แ แแแฌแงแแแแแแแแแ แกแฎแแแแแกแฎแแ แฌแงแแ แแแแ แกแฎแแแแแกแฎแแ แแแ แกแแแแก แจแแ แแก แแแแแ แแแ แแ แแแฃแจแแแแแก apk แคแแแแแก แแแแกแฎแแแแแแฃแแ แฎแแแแแฌแแ แแก แแแแ; แแฎแแแ แฌแงแแ แแแแ แแแ แกแแแก แแแกแขแแแแชแแแแแ, แฏแแ แฃแแแ แฌแแจแแแแ แแแแแกแขแแแแ แแแฃแแ แแแ แกแแ แแแแแชแแแแแแแ แแ แแแ - แแแกแแแ แแแ แกแแแก แฅแแจแ แแ แแแแแแแแแ แแแแก แแกแขแแ แแ (แแ แแแแ แแแแแ, แ แแแแ แแแแแแขแแแแ แแแแแชแแแแแ).
แฒขแแฅแแแแฃแ แ แแแขแแแแแ
แแ แกแแญแแ แแแแก Google/YouTube แแแแแ แแจแก, แแญแแ แแแแแ แแฎแแแแ แแแขแแ แแแขแ, แแงแแแแแก แจแแแแแ แแแแแแแแแแแแก:
NewPipeExtractor YouTube แกแแ แแแกแแแแ แแแแแชแแแแแแก แแแกแแฆแแแแ แแแแแแแแแแแ แ แแแแแแก แแแกแแแ แแแแ.
แฆแแ แฌแงแแ แ, แฃแคแแกแ GPLv3 แแแชแแแแแ.
แแแแฎแแ: แแแแแแแ แแแแแแฃแ แแ แแแแกแแแขแแแแก แแแฎแแฎแแ แแแขแแ แแแแก แแแแแ แแแแก แแแ แแจแ (แแ แแจแแแ แ แแแ แซแแแแแ)?
แแแกแฃแฎแ: แ แ แแฅแแ แฃแแแ, แแก แแแแแแแแ แแ, แแฅแแแแแแ แแแแแแแแแแฃแแ, แ แแแแแ แแแกแขแ แฃแแแแขแ แแแแแแงแแแแ แกแแฏแแ แแ แฎแแแแแกแแฌแแแแแ แแแคแแ แแแชแแแก แฌแแกแแแแแฎแแ. แแแ แแ แแแแกแ:
แ แแฆแแช แแแแ
แแแแแแแแแแ
แแแกแแแ แแแ แกแแแก แฉแแขแแแ แแแแก แแแแ แชแแขแ แจแ แแแแขแแแแแแ, แแแแขแแ แแฅ แแ แแแแชแแ, แแแแแขแแ แแกแแแฃแแแ แแแ แแแแ แแแแแฎแแแแ แกแแฌแงแแก แแแแก, แแก แซแแ แแแแแแ แแแแกแแ
แแแแฎแแ, แ แแแแ แแแแแฆแแ แแแแแ แแแแแแแก แแแกแแแแ แแ แกแแฏแแ แ แแแแแ แแแแ แแแก แแแกแแแแ แแแแแ แแ แแแแแแแแแจแแ แแก แแแแแ แจแ.
แแแฃแแแแจแแ แแ แแแแแแแแแแ
dependencies {
...
// NewPipe: youtube parser
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}
แกแแแแขแแ แแกแแ, แ แแ แแแแก แจแแแแแ แแฅแแแ แแแแแช แแแ แจแแซแแแแ แแแก แแแแแงแแแแแแก, แ แแแแแ... แแแแแแแแแแ แฃแฉแแแแแ Downloader แแแแกแแก แแแแแขแแแแแแก. แแแกแ แแแแแ แแแ แจแแกแแซแแแแแแแ แแ แแแฅแขแจแ แแแขแแแแขแฃแ แ แขแแกแขแแแแก แแแ แแฅแขแแ แแแแแ
แแแแฆแแ แแแแแ แแแแแแแก แแแกแแแแ แแ YouTube แแแแกแแแขแแ แแแแแ แแแแ แแแก แแแกแแแแ แแแ:
public String extractYtStreamUrl(final String ytVidUrl) throws ExtractionException, IOException {
// https://github.com/TeamNewPipe/NewPipeExtractor/blob/dev/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractorDefaultTest.java
NewPipe.init(Downloader.getInstance(), new Localization("GB", "en"));
final YoutubeStreamExtractor extractor = (YoutubeStreamExtractor) YouTube
.getStreamExtractor(ytVidUrl);
extractor.fetchPage();
final String streamUrl = extractor.getVideoStreams().size() > 0 ? extractor.getVideoStreams().get(0).getUrl() : null;
// for (final VideoStream stream : extractor.getVideoStreams()) {
// stream.getUrl();
// }
return streamUrl;
}
แแแแแ แแแกแแแแ แแ ytVidUrl แจแแแซแแแแ แแงแแก แแแแแกแแแแ แ แแแแแแก แแแแ แแแก แกแแฏแแ แ แแแกแแแแ แแ YouTube แแแแกแแแขแแ, แแแแแแแแแ
แแแแแแแจแ แแฅแแแแ
แแแฃแแแแจแแ แแ แแแแแแแแแแ แแ แแแฅแขแก
dependencies {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}
แฉแแแ แแ แแแแแแฎแแแแแ แแแแแแแจแแก แแแแแแแแแขแแก แแแแแแแชแแแก แแแ แแแแ แแแแแแแกแแแแก แงแแแแ แแแฃแแแกแก (แแแแแแแแแแ แจแแแแซแแแแ แแแฎแแ แแ แแแฅแขแแก แแแแกแแแขแแ แแ แแแแจแ), แฉแแแ แแฎแแแแ แแแแแแฎแแแแแ, แแฃ แ แแแแ แฃแแแ แแแแฌแงแแ แแแแแแก แแแแแ แ YouTube-แแแ แแแแแ แจแ: แแแแแ แแแฆแแแฃแแ แแแกแแแแ แแ:
private void playVideoStream(final String streamUrl, final long seekTo) {
if (streamUrl == null) {
// ะพััะฐะฝะพะฒะธัั ะฟัะพะธะณััะฒะฐะฝะธะต ัะตะบััะตะณะพ ัะพะปะธะบะฐ, ะตัะปะธ ะฑัะป ะทะฐะณััะถะตะฝ
videoPlayerView.getPlayer().stop(true);
} else {
// https://exoplayer.dev/
// https://github.com/google/ExoPlayer
final Uri mp4VideoUri = Uri.parse(streamUrl);
final MediaSource videoSource = new ProgressiveMediaSource.Factory(videoDataSourceFactory)
.createMediaSource(mp4VideoUri);
// ะะพััะฐะฒะธะผ ะฝะฐ ะฟะฐัะทั ััะฐัะพะต ะฒะธะดะตะพ, ะฟะพะบะฐ ะณะพัะพะฒะธะผ ะฝะพะฒะพะต
if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
// ะัะปะธ ััะฐะฒะธัั ะฝะฐ ะฟะฐัะทั ะทะดะตัั ะฟะพัะปะต ัะพะณะพ, ะบะฐะบ ะฟะปะตะตั ะฒััะฐะป ะฝะฐ ะฟะฐัะทั ัะฐะผ, ะทะฐะบะพะฝัะธะฒ
// ะธะณัะฐัั ะฒะธะดะตะพ, ะฟะพะปััะธะผ ะทะดะตัั ะฒัะพัะพะต ัะพะฑััะธะต STATE_ENDED, ะฟะพััะพะผั ะฝะฐะผ ะฝัะถะฝะฐ ะทะดะตัั
// ัะฟะตัะธะฐะปัะฝะฐั ะฟัะพะฒะตัะบะฐ.
// ะัะธ ััะพะผ ะทะฝะฐัะตะฝะธะต getPlayWhenReady() ะพััะฐะฝะตััั true, ะฟะพััะพะผั ะฟัะพะฒะตััะตะผ ะธะผะตะฝะฝะพ ัะพััะพัะฝะธะต.
// https://github.com/google/ExoPlayer/issues/2272
videoPlayerView.getPlayer().setPlayWhenReady(false);
}
// Prepare the player with the source.
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);
// ะฃะบะฐะถะตะผ ัะตะบัััั ะฟะพะทะธัะธั ััะฐะทั ะฟัะธ ะทะฐะณััะทะบะต ะฒะธะดะตะพ
// (ะฒ ะบะพะผะตะฝัะฐั
ััะพ-ัะพ ะฟะธััั ััะพ-ัะพ ะฟัะพ ะดะฐัะฐัะพััั, ะบะพัะพััะต ะฟะพะดะดะตัะถะธะฒะฐัั ะธะปะธ ะฝะต ะฟะพะดะดะตัะถะธะฒะฐัั
// ะฟะตัะตั
ะพะดั seek ะฟัะธ ะทะฐะณััะทะบะต, ะฟะพั
ะพะถะต, ััะพ ััะพ ัะธะณะฝั - ะฟัะพััะพ ะดะตะปะฐะตะผ seek ััะฐะทั ะฟะพัะปะต ะทะฐะณััะทะบะธ)
// Exoplayer plays new Playlist from the beginning instead of provided position
// https://github.com/google/ExoPlayer/issues/4375
// How to load stream in the desired position? #2197
// https://github.com/google/ExoPlayer/issues/2197
// ะฒ ััะพะผ ะผะตััะต ะฝะพัะผะปะฐัะฝัะน duration ะตัะต ะฝะต ะดะพัััะฟะตะฝ, ะฟะพััะพะผั ะตะณะพ ะฝะต ะฟัะพะฒะตััะตะผ
//if(seekTo > 0 && seekTo < videoPlayerView.getPlayer().getDuration()) {
if (seekTo > 0) {
// ะฝะฐ 5 ัะตะบัะฝะด ัะฐะฝััะต
videoPlayerView.getPlayer().seekTo(seekTo - 5000 > 0 ? seekTo - 5000 : 0);
}
videoPlayerView.getPlayer().setPlayWhenReady(true);
}
}
แชแแแแแแ แกแแแแแฎแแแ
- แแ แแแฃแแ แแแก แแแแแแแแก แแกแแแแแ แแแ แจแแแฆแฃแแแแ, แ แแแแแแแช แกแแญแแ แแแแก แแฅแแแแก Google/YouTube แแแแแ แแจแจแ แจแแกแแแแก
แแแแแแแแแ:
แ แฉแแแ: แแแแแแขแแ แแกแแแ แแแแแแแแ แจแแ แกแแแจแ แแ แกแแฎแแแแ แแแแแแก แแแขแแ แก แแแฎแกแแแก แจแแชแแแแแ แแแฌแแกแแแฃแแ แจแแแฆแฃแแแ.
- แแแแแแ แแ แกแแแแฃแฌแงแแแแ แแแแแ, แ แแแแแแแกแแแแกแแช แกแแ แแแกแ แแแ แฃแแแแก แแฃแแแแแ แกแแแ แซแแก, แแ แแแแแแ แแแ (แแกแแแ แแแแแแแแแกแแแแก, แกแแแแจแ แแ แแแแแ แแแจแ แฎแแแแ แซแแแแแแ แแแแแจแแฃแแแ แ แแแแ แช โ[dur undef]โ)
แแแแแแแแแ:
แ แฉแแแ: แแแแแแขแแ แแกแแแ แแแแแแแแ แจแแ แกแแแจแ.
- แแแแแแแแ, แ แแแแแแแช แฎแแแแแกแแฌแแแแแแ แแฎแแแแ แแแ แแแแแ แ แแแฃแแแแแก แกแแจแฃแแแแแแ, แจแแแซแแแแ แแ แแแฎแแแแก แแแแแแแแ แแ แแแกแแแ แแ แกแแแจแ, แแแจแแแแช แแ, แแฃ แแฅแแแ แฉแแแแขแแแ แแแแ แแแแฎแแแ แแแแแก แงแแแแ แแแแแแก
แแแแแแแแแ:
-
แแฃ แฌแแแฌแงแแแแแ แกแแฏแแ แ แแแแแแก, แ แแแแแแช แแ แกแแญแแ แแแแก แจแแกแแแแก, แฃแแ แแแก แแ แแฃแแแ แจแ, แแแแ แแ แแ แฃแแ แแแก แแแแแ แจแ, แแแแแแแแแ แจแแชแแแแแก แแแแแ แแจแ (แกแแแกแแแแ แจแแกแแซแแแแแแแ, แ แแ แแ แแแแแแ แฃแแแ แแแแแแ แแแฃแแแ แแฎแแ แแแ แกแแแจแ NewPipeExtractor แแ แแฅแแแ แแแแญแแ แแแแแ แแฎแแแแ แแกแแแแแแแก แแแแแฎแแแแ แแ แแแ แกแแแ,
แแแแแแแแแ ). -
แแแขแแ แคแแแกแ แจแแแซแแแแ แจแแแแแแแก, แแฃ แแแขแแ แแแขแ แแแแแ (แแแแ แแ แแ แแแแแ แแฃแแแ)
แจแแแแแแ,
แฉแแแ แจแแแแ แแแแแจแแขแแแแ แแแแแแแแ แกแแแกแฃแแแแก แกแแแ แข แขแแแแแแแแ แจแ, แ แแแแแแช แแแแ แแแแแก แแแแแแแชแแแแก แแ แจแแฃแซแแแ. แแแแขแแ, แกแแฃแแแแแกแ แแจแแแแแก แแแแขแ แแแ แแแแแช แแแ แแแแ.
แแแแ แแ แแแแแแแชแแ แกแแแแแ แแกแแ แแแกแแฎแแ แฎแแแแแ แแฆแแแฉแแแ, แ แแ แแ แแแแแแ แแแแแฌแงแ แแแกแ แแแแแงแแแแแ. แแแ แแฃแแ แกแแแฃแจแแ แแแ แกแแแแแแแ แแแ แแแแ แจแแแแแญแแแแแแ แแกแแแ แแงแ, แ แแ แกแฎแแ แกแแแงแแ แแจแ แแแงแแแ. แแแแแ แแแแขแแแขแ แแขแแแ แแแแ YouTube-แแแ, แแแแ แแ แแก แฃแแแ แแ แแ YouTube, แแ แแแแ แ แแฆแแช แกแฎแแ, แฃแกแแคแ แแฎแ แแ แแแแขแ แแแแ แแแแแ, แแแแฅแแก แแแแแแแแ แแกแขแแแ แแแแแฆแ แแ แแแแแก แฅแแแแจแ แฉแแแ. แแ แแก แงแแแแแคแแ แ แ แแแแแแแแแชแแแแแแ.
แฌแงแแ แ: www.habr.com