YouTube рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ рдФрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ

рдЖрдкрдХрд╛ рджрд┐рди рд╢реБрдн рд╣реЛ!

рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдПрдХ рдЫреЛрдЯреА django рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдЖрдкрдХреЗ YouTube рдЪреИрдирд▓ рдкрд░ рд╡реАрдбрд┐рдпреЛ рдХреЛ рд░реВрдкрд╛рдВрддрд░рд┐рдд / рдЕрдкрд▓реЛрдб рдХрд░рддреА рд╣реИред


рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж ... рдореИрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рдХреНрд╖реЗрддреНрд░реАрдп рдЯреЗрд▓реАрд╡рд┐рдЬрди рдХрдВрдкрдиреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдПрдХ рдЕрджреНрднреБрдд рджрд┐рди рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рд▓реЛрдЧ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рджреЗрдЦреЗрдВ, рди рдХреЗрд╡рд▓ рдиреАрд▓реЗ рдкрд░рджреЗ рдкрд░, рдмрд▓реНрдХрд┐ YouTube рдкрд░ рднреАред рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдУрдордиреЗрди рд╕реЗ рдПрдХ рдкреНрд░рд╕рд╛рд░рдг рд╕рд░реНрд╡рд░ рд╣реИ, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рддреИрдпрд╛рд░ рдХреА рдЧрдИ рд╕рднреА рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЛ рдореВрд╡ рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ 15 рдорд┐рдирдЯ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдФрд╕рдд рд╡рдЬрди = 3.5 рдЬреАрдмреА рд╣реИред рдЗрд╕ рдЖрдХрд╛рд░ рдХреА рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рдердХрд╛рдК рдФрд░ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реИ, рдХреНрд▓рд┐рдк рдХреЛ mp4 (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдирд╛ рдФрд░ YouTube рдкрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдХрд╛рд╢ рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЧреБрдгрд╡рддреНрддрд╛ рдирд╣реАрдВ рдЦреЛрддреЗ рд╣реИрдВ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ 100 рдПрдордмреА рдореЗрдВ 3.5 рдЬреАрдмреА рдХрд╣реАрдВ рд╕рдВрдХреБрдЪрд┐рдд рд╣реИрдВред

рд▓реЗрдЦ "рдЦреЛрдЬ" рдФрд░ "рд╡рд░реНрд╖ рдХреА рд╕рдлрд▓рддрд╛" рдХрд╛ рд╢реАрд░реНрд╖рдХ рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдмрд╕ рдЬреНрдЮрд╛рдд рддрдереНрдпреЛрдВ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реИред

1. рдПрд▓реНрдЧреЛрд░рд┐рджрдо


рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

рдореИрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рднреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЕрд▓рд╛ "рдХреМрди / рдХрдм / рдХреНрдпрд╛ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред"

2. рдХреНрдпрд╛ рдЬрд░реВрд░рдд рд╣реИ?


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдкрдиреЗ django рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдЖрдЧреЗ рдкрдврд╝рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрдХреЗрдЬреЛрдВ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:


3. рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛


рдореИрдВ рдЦреБрдж рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рдЖрдк рдпрд╣ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдВрдЦ рдХреЗ рдХрд┐рдирд╛рд░реЗ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ рдЕрдВрддрд┐рдо рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╣реИ:


рдореИрдВ рд╢реБрд░реВ рд╕реЗ рд╣реА рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░реЗрдВ: django-admin.py startproject YTupload

рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ:
ENCODE_DIR_FROM = '/__________YT/' ENCODE_DIR_TO = os.path.join(ROOT,'file_out') #     ...        file_out    YT_LOGIN = 'login@gmail.com' #   YT YT_PASSWORD = 'password' #   YT 


рдКрдкрд░, рдореИрдВ рд▓реЙрдЧрд┐рдВрдЧ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ "рдЕрдЪреЗрдд" рдерд╛ред рдпрд╣рд╛рдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
django-admin.py startapp control рдПрдкреНрд▓реАрдХреЗрд╢рди рдмрдирд╛рдПрдВ
рдореЙрдбрд▓ рдореЙрдбрд▓ рдЦреЛрд▓реЗрдВ
 # -*- coding: utf-8 -*- from django.db import models from django.contrib.auth.models import User class Log(models.Model): filename = models.CharField(max_length=300) filesize = models.CharField(max_length=300) user = models.ForeignKey(User) created = models.DateTimeField() uploaded = models.DateTimeField(null=True, blank=True) link = models.CharField(max_length=300, blank=True) #youtube properties title = models.CharField(max_length=300) description = models.TextField() keywords = models.CharField(max_length=300) status = models.CharField(max_length=300, blank=True) class People(models.Model): login = models.OneToOneField(User, primary_key=True) name = models.CharField(max_length=200) 


рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд╛рдУ
 # -*- coding: utf-8 -*- from django.shortcuts import render_to_response from django.http import HttpResponseRedirect, HttpResponse, Http404 from django.template import RequestContext from django.shortcuts import get_object_or_404, get_list_or_404 from django.contrib.auth import login, logout from django.contrib.auth.forms import AuthenticationForm from control.models import * import os, datetime, settings #    def LogStatus(l): try: return Log.objects.filter(filename=l)[0].status except: return None def index(request, template): if not request.user.is_authenticated(): return HttpResponseRedirect('/enter/') loglist = Log.objects.order_by('-id')[:10] #    listdir = os.listdir(settings.ENCODE_DIR_FROM) dictdir = [{'filename':None,'filesize':None, 'status':None} for i in range(len(listdir))] n = 0 for l in listdir: dictdir[n]['filename'] = l dictdir[n]['filesize'] = os.path.getsize(os.path.join(settings.ENCODE_DIR_FROM,l)) dictdir[n]['status'] = LogStatus(l) n+=1 #     if request.method == 'POST': filename = request.POST['filename'] filesize = request.POST['filesize'] title = request.POST['title'] description = request.POST['description'] keywords = request.POST['keywords'] #     ? if Log.objects.filter(filename=filename): return HttpResponse('already in query') else: #   Log,   "" l = Log(filename=filename, filesize=filesize, user=User.objects.filter(id=int(request.user.id))[0], created=datetime.datetime.now(), title=title, description=description, keywords=keywords, status='in query') l.save() return HttpResponseRedirect('/') return render_to_response(template, {'dictdir':dictdir, 'loglist':loglist,}) def exit(request): logout(request) return HttpResponseRedirect('/enter/') def enter(request, template): authform = AuthenticationForm() if request.user.is_authenticated(): return HttpResponseRedirect('/') if request.method == 'POST': authform = AuthenticationForm(data=request.POST) if authform.is_valid(): login(request, authform.get_user()) return HttpResponseRedirect('/') return render_to_response(template, {'authform': authform}) 


рдХреЛрдб рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ), рдЗрдВрдбреЗрдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди 2 рд╕реВрдЪрд┐рдпрд╛рдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ : рдкрд╣рд▓реА - рдХреМрди рд╕реА рдлрд╛рдЗрд▓реЗрдВ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реИрдВ, рджреВрд╕рд░реА - рдХреМрди рд╕реА рдлрд╛рдЗрд▓реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд▓реЙрдЧ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИрдВред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдКрдкрд░ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ ... рджрд░реНрдЬ рдХрд░реЗрдВ рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╣реИред

рдЖрдЧреЗ рдмрдврд╝реЛ: urls.py
 from django.conf.urls.defaults import * from django.contrib import admin admin.autodiscover() import views, settings urlpatterns = patterns('', (r'^admin/', include(admin.site.urls)), (r'^$', views.index, {'template': 'index.html'}), (r'^enter/$', views.enter, {'template': 'enter.html'}), (r'^exit/$', views.exit), (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}), ) 

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рд▓реЙрдЧ рдЗрди рдХрд┐рдпрд╛, рд▓реЙрдЧ рдЗрди рдХрд┐рдпрд╛, рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛!

рдЕрдВрддрд┐рдо рдХреЙрд░реНрдб рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╣реИ , рдЬреЛ рд╕рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
 # -*- coding: utf-8 -*- import settings, os, datetime os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' from control.models import * if Log.objects.filter(status='converting'): quit() else: try: file = Log.objects.filter(status='in query')[0] except: quit() file.status = 'converting' file.save() #    basename, extension = os.path.splitext(file.filename) newfilename = basename + '.flv' os.system('ffmpeg -i ' + os.path.join(settings.ENCODE_DIR_FROM, file.filename) + ' -ar 22050 -vb 1500kbits/s ' + os.path.join(settings.ENCODE_DIR_TO, newfilename)) file.status = 'uploading' file.save() os.system('youtube-upload --email=' + settings.YT_LOGIN + ' --password=' + settings.YT_PASSWORD + ' --title="' + file.title.encode('utf-8') + '" --description="' + file.description.encode('utf-8') + '" --category="News" --keywords="' + file.keywords.encode('utf-8') + '" ' + os.path.join(settings.ENCODE_DIR_TO, newfilename).encode("utf-8")) file.status = 'uploaded' file.uploaded = datetime.datetime.now() file.save() 


рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХреЛрдВрдЯреНрд░рд╛рдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрд░реНрде рд╕рд░рд▓ рд╣реИ: рд╕реНрдерд┐рддрд┐ рдХреЛ "рдХреНрд╡реЗрд░реА рдореЗрдВ" (рдХрддрд╛рд░ рдореЗрдВ) рдХреЗ рд╕рд╛рде рдкрд╣рд▓реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ, рдХрдиреНрд╡рд░реНрдЯ (рд╕реНрдерд┐рддрд┐ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ), рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ (рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рддрд┐ рдмрджрд▓реЗрдВ), рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ (рд╕реНрдерд┐рддрд┐ = рдЕрдкрд▓реЛрдб)ред
crontab:
*/1 * * * * python /var/www/YTupload/converting.py &> /dev/null

рдЦреИрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ html-code рджреЗрддрд╛ рд╣реВрдВ:
enter.html
 <!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title> | YTUpload | 1vank1n.habrahabr.ru</title> <style type="text/css"> html, body { font-size: 14px; font-family: Georgia, "Times New Roman", Times, serif; height: 100%; width: 100%; margin: 0; padding: 0; } #table-center { height: 100%; width: 100%; } #form-auth { margin-bottom: 0px; margin-top: 0px; margin-right: auto; margin-left: auto; height: 100px; width: 330px; } #form-auth table td { padding: 5px; } #form-auth input { background-color: white; border-color: #cccccc; border-style: solid; border-width: 1px; padding: 5px; display: block; margin: 0 auto; } </style> </head> <body> <table id="table-center"> <tr><td> <form id="form-auth" action="" method="POST">{% csrf_token %} <table > {{ authform.as_table }} <input type="hidden" name="formname" value="auth"> </table> <input type="submit" value=""> </form> </td></tr> </table> </body> </html> 


index.html
 <!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>YTUpload | 1vank1n.habrahabr.ru</title> <script type="text/javascript" src="/media/jquery-1.6.1.min.js"></script> <script type="text/javascript"> $(function(){ $('#choose_file a').click(function(){ $('#file_properties').fadeIn(); $('input[name="filename"]').attr('value', $(this).text()); $('input[name="filesize"]').attr('value', $(this).next('span').text()); }); }); </script> <style type="text/css"> body {width:1000px;margin:0 auto;position: relative;font-size:11pt;} #file_properties {display: none;} #choose_file {width: 490px; float: left; height: 500px; overflow-y: auto;} #loglist, #loglist table {width: 500px; float:right;} #loglist td {border: 1px solid #555;margin: 0;padding: 5px;} #exit {display: block; position: absolute; top:0; right:0; padding: 10px; background: #ddf; color: #000; text-decoration: none;} input, textarea, button {border: 1px solid #ccc; padding:5px;} </style> </head> <body> <a id="exit" href="/exit/"></a> <div id="loglist"> <h1></h1> <table cellpadding="0" cellspacing="0"> <tr> <td> </td> <td></td> <td></td> </tr> {% for l in loglist %} <tr> <td>{{ l.filename }}</td> <td>{{ l.filesize }}</td> <td>{{ l.status }}</td> </tr> {% endfor %} </table> </div> <div id="choose_file"> <h1>1.  :</h1> <p>      ,       (+,-,%,',",^,&)!!!</p> {% for d in dictdir %} <li>{% if not d.status %}<a value="{{ d.filename }}" href="#">{% endif %}{{ d.filename }}</a> | <span>{{ d.filesize|filesizeformat }}</span></li> {% endfor %} </div> <div style="height:10px;width:100%;clear:both;"></div> <div id="file_properties"> <h1>2.  :</h1> <table> <form method="post" name="uploadform"> <tr><td>:</td><td><input type="text" name="filename" readonly /> <input type="text" name="filesize" hidden></td></tr> <tr><td>:</td><td><input type="text" name="title" /></td></tr> <tr><td>:</td><td><textarea name="description"></textarea></td></tr> <!-- <tr><td>:</td><td><select></select></td></tr> --> <tr><td> :</td><td><input type="text" name="keywords" /></td></tr> <tr><td></td><td><input type="submit" value="3.   YouTube" /></td></tr> </table> </form> </div> </body> </html> 


4. рд╕рдорд╛рдкрди рдХреЗ рдмрдЬрд╛рдп


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЛ рдорджрдж рдХрд░рддрд╛ рд╣реИ / рд╕рдордп рдмрдЪрд╛рддрд╛ рд╣реИ рдпрд╛ рдмрд╕ рдордЬрд╝реЗ рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдХреНрдпрд╛ рдореИрдВ рдЗрд╕реЗ рдЧреАрдереВрдм рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?), рдзрдиреНрдпрд╡рд╛рдж рднрдЧрд╡рд╛рди рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЗрдВ рдЕрднреА рднреА рддрдп рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИрдВ:


рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдкреАрдПрд╕ рдХреЛрдб рдПрдХрджрдо рд╕рд╣реА рд╣реИ, рдпрд╣ "рдкреЙрд▓рд┐рд╢" рд╣реЛрдЧрд╛ред рдЕрдиреБрдХреВрд▓рди рдпреБрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрд╡рдЧреЗрдиреА рдмреЗрд╕реНрдкрд▓реА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

UPD: github = https://github.com/1vank1n/YTupload/ рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ, рдореБрдЭреЗ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЦреБрд╢реА рд╣реЛрдЧреА рдЬреЛ рдЗрд╕реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рд▓рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛!

Source: https://habr.com/ru/post/In124508/


All Articles