рдкрд░рд┐рдЪрдп рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ: рдореИрдВ рд╕реНрдерд╛рдиреАрдп рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ, рдЪреИрдирд▓ рдФрд░ рдЕрдиреБрд╢рдВрд╕рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдпреВрдЯреНрдпреВрдм рдСрдирд▓рд╛рдЗрди рдкреНрд▓реЗрдпрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рд╡рд┐рд╕реНрддреГрдд рдкрд░рд┐рдЪрдп:
рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдореБрдЭреЗ рдПрдХ рдЕрджреНрднреБрдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓реЗрдЦрдХ рдХреЗ рд╕рдорд╛рди рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдерд╛
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЪреИрдирд▓ рд╡реНрд╣рд╛рдЗрдЯрд▓рд┐рд╕реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдиреАрд░рд╕, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдШрд╛рддрдХ рджреЛрд╖ рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ - рдПрдирдЖрдИрдПрдЪ рдореБрдЭреЗ (рдФрд░, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдореЗрд░реЗ рдмреЗрдЯреЗ рдХреЛ) рдЗрд╕рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд▓рдЧрд╛, рдЦрд╛рд╕рдХрд░ рдпреВрдЯреНрдпреВрдм рдХрд┐рдбреНрд╕ рдкреНрд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрджрдд рдХреЗ рдмрд╛рджред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреБрдЫ рд╕рдордп рдмрд╛рдж рдореИрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдерд╛ред рдХреБрдЫ рд╕рдордп рдмрд╛рдж рдкрд╣рд▓реА рд░рд┐рд▓реАрдЬрд╝ рдкрд░ рдЯреИрдЧ рд▓рдЧрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ред
рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:
- рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдЪреИрдирд▓ рдФрд░ рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдЬреЛрдбрд╝реЗрдВ - рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
- рдЬреЛрдбрд╝реА рдЧрдИ рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдореЗрдВ, рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡реАрдбрд┐рдпреЛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рдЙрдиреНрд╣реЗрдВ рдмрдВрдж рдХрд░ рджреЗрдВ
- рдЕрдиреБрд╢рдВрд╕рд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЗрд╡рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдЪреИрдирд▓реЛрдВ рдФрд░ рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ
рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд, GPLv3 рд▓рд╛рдЗрд╕реЗрдВрд╕:
рдиреАрдЪреЗ рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЕрд╡рд▓реЛрдХрди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА Google API рдФрд░ рд╡реЗрдм рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдкрдиреЗ Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ YouTube рд╡реАрдбрд┐рдпреЛ рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ, рдЗрд╕ рдкрд░ рдХреБрдЫ рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВред
рдореБрдЦреНрдп рд╕реНрдХреНрд░реАрди рдкрд░ рдФрд░ рдкреНрд▓реЗрдпрд░ рд╕реНрдХреНрд░реАрди рдкрд░: рдЧреИрд░-рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪреИрдирд▓реЛрдВ рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛рдПрдБ
рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ
рдПрдХ рдирдпрд╛ рдЪреИрдирд▓ рдпрд╛ рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдЬреЛрдбрд╝реЗрдВ
рдСрдирд▓рд╛рдЗрди рдирд╛рдо рд╕реЗ рдЦреЛрдЬреЗрдВ рдпрд╛ рдХреЛрдИ рдЬреНрдЮрд╛рдд рдкрддрд╛ рдбрд╛рд▓реЗрдВред рдХрд┐рд╕реА рдЪреИрдирд▓ рдпрд╛ рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдХреЗ рд╡реАрдбрд┐рдпреЛ рдХреА рд╕реВрдЪреА рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬреА рдЬрд╛рддреА рд╣реИ; рдЖрдЗрдХрди рдХреИрд╢реНрдб рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
рдЧрддрд┐рд╢реАрд▓ рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ - рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо рдЪрд▓рд╛рдПрдБ
рд╡реАрдбрд┐рдпреЛ рдЕрдиреБрд╢рдВрд╕рд╛рдУрдВ рдореЗрдВ рдХреЗрд╡рд▓ рд╡реЗ рд╡реАрдбрд┐рдпреЛ рд╣реЛрдВрдЧреЗ рдЬреЛ рдЦреЛрдЬ рдХреНрд╡реЗрд░реА рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕реА рддрд░рд╣, рдпрджрд┐ рдЖрдк рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рд╕реЗрдЯрд┐рдВрдЧ рд╕реЗ рдХреЛрдИ рд╡реАрдбрд┐рдпреЛ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЕрдиреБрд╢рдВрд╕рд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдХреЗрд╡рд▓ рдЙрд╕реА рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдХреЗ рд╡реАрдбрд┐рдпреЛ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред
рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдФрд░ рдЪреИрдирд▓ рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдмрдВрдж рдФрд░ рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: рдЕрдХреНрд╖рдо рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдХреЗ рд╡реАрдбрд┐рдпреЛ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ, рджреЗрдЦрдиреЗ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдФрд░ рдкрд╕рдВрджреАрджрд╛ рд╕реВрдЪреА рд╕реЗ рднреА рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ, рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рджреЛрдмрд╛рд░рд╛ рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╡реЗ рд╡рд╣рд╛рдВ рдлрд┐рд░ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред
рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯ рдореЗрдВ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдЬреЛрдбрд╝реЗрдВ
рдПрдХ рдЕрд╡рд░реБрджреНрдз рд╡реАрдбрд┐рдпреЛ рдЕрдиреБрд╢рдВрд╕рд╛рдУрдВ рдореЗрдВ, рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдкрд╕рдВрджреАрджрд╛ рдХреА рд╕реВрдЪреА рдФрд░ рджреЗрдЦрдиреЗ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╡реАрдбрд┐рдпреЛ рдЕрднреА рднреА рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
рдХрд╛рд▓реА рд╕реВрдЪреА рджреЗрдЦреЗрдВ рдФрд░ рдЧрд▓рддреА рд╕реЗ рдЕрд╡рд░реБрджреНрдз рдЖрдЗрдЯрдореЛрдВ рдХреЛ рдкреБрдирдГ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ:
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ > рд╣реЗрдбрд░ рдореЗрдиреВ > рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯ
рдкрд╕рдВрджреАрджрд╛ рд╡реАрдбрд┐рдпреЛ рдФрд░ рджреЗрдЦрдиреЗ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕
рдкреНрд▓реЗрдпрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдкрд╕рдВрджреАрджрд╛ рд╡реАрдбрд┐рдпреЛ рдКрдкрд░реА рджрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рддрд╛рд░рд╛рдВрдХрди рдЪрд┐рд╣реНрди рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВред
рд╕реНрдХреНрд░реАрди рд╢реАрд░реНрд╖рдХ рдореЗрдВ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдФрд░ рдЧреИрд▓рд░реА рдФрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
рджреЗрдЦрдиреЗ рд╡рд╛рд▓реА рд╕реНрдХреНрд░реАрди рдпрд╛ рдХрд┐рд╕реА рднреА рд╕реВрдЪреА рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдпрд╛ рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдХрд╛ рдирд╛рдо рдпрд╛ рдкрддрд╛ рдХреЙрдкреА рдХрд░реЗрдВред
рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд - рдЕрдиреБрд╢рдВрд╕рд┐рдд рдЪреИрдирд▓ рдФрд░ рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдЬреЛрдбрд╝реЗрдВ
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреБрд░рдВрдд рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдЬреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ред
рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЪреИрдирд▓ рдФрд░ рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдмрдВрдж рдпрд╛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕реНрдерд╛рдкрдирд╛
╨б╤В╤А╨░╨╜╨╕╤Ж╨░ ╨┐╤А╨╛╨╡╨║╤В╨░:
рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ:
рд░рд┐рд▓реАрдЬрд╝:
- рдпрд╣ Google Play рдкрд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ (Google рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдкреАрдЖрдИ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЪреИрдирд▓ рд╡реНрд╣рд╛рдЗрдЯрд▓рд┐рд╕реНрдЯ рдпрд╛ рдиреНрдпреВрдкрд╛рдЗрдк рдкреНрд▓реЗрдпрд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ)
- рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ:
https://github.com/sadr0b0t/yashlang/ - рд░рд┐рд▓реАрдЬрд╝ рдЕрдиреБрднрд╛рдЧ рд╕реЗ рдПрдкреАрдХреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:
https://github.com/sadr0b0t/yashlang/releases - рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рд╕рдордп рдмрд╛рдж рдХреИрдЯрд▓реЙрдЧ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛
рдПрдл Droid (рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рд╕реНрд╡реАрдХреГрдд рд╣реЛ рдЧрдпрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рд▓рдЧрднрдЧ рдПрдХ рдорд╣реАрдиреЗ рд╕реЗ рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝рд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдирд╣реАрдВ
рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдПрдХ рд╣реА рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдПрдкреАрдХреЗ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЗ рдХрд╛рд░рдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛; рдХрд┐рд╕реА рдирдП рд╕реНрд░реЛрдд рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ - рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдХреИрд╢ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рдЗрддрд┐рд╣рд╛рд╕ (рдпрд╛ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЬрд╛рдиреЗрдВ)ред
рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
рдЗрд╕рдХреЗ рд▓рд┐рдП Google/YouTube рдЦрд╛рддреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
рдиреНрдпреВрдкрд╛рдЗрдкрдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯрд░ YouTube рд╕реЗрд╡рд╛ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░рдПрдХреНрд╕реЛрдкреНрд▓реЗрдпрд░ рд╡реАрдбрд┐рдпреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП.
рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд, рдореБрдлрд╝реНрдд GPLv3 рд▓рд╛рдЗрд╕реЗрдВрд╕ред
рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рд▓реЗрдЦрдХреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдХреЗ рдмрд┐рдирд╛ (рдпрд╛ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд╕рд╛рде) рд╡реЗрдмрд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рдЦрдВрдЧрд╛рд▓рдирд╛ рдЖрдо рддреМрд░ рдкрд░ рдХрд╛рдиреВрдиреА рд╣реИ?
рдЙрддреНрддрд░: рдмреЗрд╢рдХ, рдпрд╣ рдХрд╛рдиреВрдиреА рд╣реИ, рдпрд╣ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ рдХрд┐ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдЖрдЧреЗ:
рдХреБрдЫ рдХреЛрдб
рдкреБрд╕реНрддрдХрд╛рд▓рдп
рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдХреЛрдб рдереЛрдбрд╝рд╛ рдмреЛрдЭрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдирд╣реАрдВ рджреВрдВрдЧрд╛, рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдХреНрд▓рд╛рд╕ рд╣реИ
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡реАрдбрд┐рдпреЛ рдкреЗрдЬ рдХреЗ рдкрддреЗ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдкрддрд╛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд▓реЗрдпрд░ рдореЗрдВ рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВред
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
dependencies {
...
// NewPipe: youtube parser
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}
рдордЬреЗ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рдж рднреА рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐... рдЙрджрд╛рд╣рд░рдг рдЧрд╛рдпрдм рдбрд╛рдЙрдирд▓реЛрдбрд░ рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
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]" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
рд╕рд▓рд╛рд╣: рдРрд╕реЗ рд╡реАрдбрд┐рдпреЛ рдХреЛ рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
- рдЬреЛ рд╡реАрдбрд┐рдпреЛ рдХреЗрд╡рд▓ рд╕реАрдзреЗ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рдкреНрд▓реЗрд▓рд┐рд╕реНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рднреА рд╡реАрдбрд┐рдпреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
-
рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡реАрдбрд┐рдпреЛ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд▓реЗрдпрд░ рдореЗрдВ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рднреЗрдЬреЗрдВ (рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ) рдиреНрдпреВрдкрд╛рдЗрдкрдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯрд░ рдФрд░ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА,
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдпреЗ ). -
рдпрджрд┐ рдЗрдВрдЯрд░рдиреЗрдЯ рдзреАрдорд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдмрдВрдж рдирд╣реАрдВ рд╣реИ) рддреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдзреАрдорд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдирддреАрдЬрддрди,
рдореЗрд░рд╛ рдмреЗрдЯрд╛ рдЯреИрдмрд▓реЗрдЯ рд╕реЗ рд╕реИрдорд╕рдВрдЧ рд╕реНрдорд╛рд░реНрдЯ рдЯреАрд╡реА рдкрд░ рдЪрд▓рд╛ рдЧрдпрд╛, рдЬреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддрд╛ред рдЗрд╕рд▓рд┐рдП, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрднрд┐рднрд╛рд╡рдХреАрдп рдирд┐рдпрдВрддреНрд░рдг рдЕрднреА рднреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╣реИред
рд▓реЗрдХрд┐рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрд░реЗ рд▓рд┐рдП рдЗрддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рд╛рдмрд┐рдд рд╣реБрдЖ рдХрд┐ рдореИрдВ рд╕реНрд╡рдпрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░ рд╕рдХрд╛ред рдЖрд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ рдкрд╣рд▓реА рдзрд╛рд░рдгрд╛ рдпрд╣ рдереА рдХрд┐ рдореИрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рджреБрдирд┐рдпрд╛ рдореЗрдВ рдерд╛ред рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдпреВрдЯреНрдпреВрдм рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдм рдпреВрдЯреНрдпреВрдм рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреБрдЫ рдФрд░ рд╣реИ, рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рдирд┐рдпрдВрддреНрд░рд┐рдд, рдЬреИрд╕реЗ рдХрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреА рдЖрдВрдЦ рд╕реЗ рдХрдирдЦрдЬреВрд░рд╛ рдирд┐рдХрд╛рд▓рдХрд░ рдХрд╛рдВрдЪ рдХреЗ рдЬрд╛рд░ рдореЗрдВ рд░рдЦ рджрд┐рдпрд╛ рд╣реЛред рдФрд░ рдпрд╣ рд╕рдм рд╕рд┐рдлрд╝рд╛рд░рд┐рд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред
рд╕реНрд░реЛрдд: www.habr.com