ytdl-org / youtube-dl

Command-line program to download videos from YouTube.com and other video sites
http://ytdl-org.github.io/youtube-dl/
The Unlicense
132.26k stars 10.03k forks source link

Lynda.com unable to log in #6462

Closed matt-the-ogre closed 9 years ago

matt-the-ogre commented 9 years ago

Verbose output follows:

[debug] System config: []
[debug] User config: []
[debug] Command-line args: [u'--username', u'PRIVATE', u'--password', u'PRIVATE', u'--verbose', u'http://www.lynda.com/OmniGraffle-tutorials/OmniGraffle-6-Essential-Training/161315-2.html']
[debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2015.07.28
[debug] Python version 2.7.10 - Darwin-14.5.0-x86_64-i386-64bit
[debug] exe versions: ffmpeg 2.7.2, ffprobe 2.7.2
[debug] Proxy map: {}
[lynda:course] Logging in as mxm23
[lynda:course] Confirming log in and log out from another device
ERROR: Unable to log in; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; type  youtube-dl -U  to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.
Traceback (most recent call last):
  File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 656, in extract_info
    ie_result = ie.extract(url)
  File "/usr/local/bin/youtube-dl/youtube_dl/extractor/common.py", line 278, in extract
    self.initialize()
  File "/usr/local/bin/youtube-dl/youtube_dl/extractor/common.py", line 272, in initialize
    self._real_initialize()
  File "/usr/local/bin/youtube-dl/youtube_dl/extractor/lynda.py", line 25, in _real_initialize
    self._login()
  File "/usr/local/bin/youtube-dl/youtube_dl/extractor/lynda.py", line 74, in _login
    raise ExtractorError('Unable to log in')
ExtractorError: Unable to log in; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; type  youtube-dl -U  to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.
dstftw commented 9 years ago

This issue has been fixed and will be available in the next version. Thanks for the report.

jaan143 commented 9 years ago

anyone can tell me plz what is exactly command now ? i am using this command and i got error youtube-dl http://www.lynda.com/3D-Animation-Architecture-tutorials/Alex-McDowell-World-Building-Narrative/362994-2.html --username sdfdfsdf@exc.com --password 12345etc

i dont know where and how to use --verbose so plz give full command with verbose etc thanks

yan12125 commented 9 years ago

For example:

youtube-dl --verbose http://www.lynda.com/3D-Animation-Architecture-tutorials/Alex-McDowell-World-Building-Narrative/362994-2.html --username sdfdfsdf@exc.com --password 12345etc
jaan143 commented 9 years ago

ERROR: Unable to log in; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see https://yt-dl.org/update on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output. Traceback (most recent call last): File "C:\Python34\lib\site-packages\youtube_dl\YoutubeDL.py", line 660, in extract_info ie_result = ie.extract(url) File "C:\Python34\lib\site-packages\youtube_dl\extractor\common.py", line 289, in extract self.initialize() File "C:\Python34\lib\site-packages\youtube_dl\extractor\common.py", line 283, in initialize self._real_initialize() File "C:\Python34\lib\site-packages\youtube_dl\extractor\lynda.py", line 25, in _real_initialize self._login() File "C:\Python34\lib\site-packages\youtube_dl\extractor\lynda.py", line 74, in _login raise ExtractorError('Unable to log in') youtube_dl.utils.ExtractorError: Unable to log in; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see https://yt-dl.org/update on how to update. Be sure to call youtube-dl with the --verbos e flag and include its complete output.

yan12125 commented 9 years ago

Could you update to the latest version (2015.10.13) and try again? See update instructions if you have problems.

jaan143 commented 9 years ago

yes my youtube-dl is updated i download yesterday from their site if you have skype then plz add me and help me dear i will very thanksfull of your skype: john.john4747

yan12125 commented 9 years ago

Look into the lines:

File "C:\Python34\lib\site-packages\youtube_dl\extractor\lynda.py", line 74, in _login
raise ExtractorError('Unable to log in')

The 74th line of youtube_dl\extractor\lynda.py is not raise ExtractorError('Unable to log in'), so I suspect you're using an out-dated version. Check it with the following command:

youtube-dl --version
2015.10.13
jaan143 commented 9 years ago

yes its showing 2015.10.13

jaan143 commented 9 years ago

can you give me lynda.py new file ? i will past and try to update in python

yan12125 commented 9 years ago

Here it is: https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/lynda.py

I guess maybe there are multiple youtube-dl installations, and youtube-dl by some reason uses the old lynda.py

jaan143 commented 9 years ago

this method is working fine in your side ? and after i replace all these lynda.py txt into old lynda.py file then i need to update something via command or not ?

jaan143 commented 9 years ago

here is my current lynda file txt

from future import unicode_literals

import re import json

from .common import InfoExtractor from ..compat import ( compat_str, compat_urllib_parse, compat_urllib_request, ) from ..utils import ( ExtractorError, int_or_none, )

class LyndaBaseIE(InfoExtractor): _LOGIN_URL = 'https://www.lynda.com/login/login.aspx' _SUCCESSFUL_LOGINREGEX = r'isLoggedIn\s:\s_true' _ACCOUNT_CREDENTIALS_HINT = 'Use --username and --password options to provide lynda.com account credentials.' _NETRC_MACHINE = 'lynda'

def _real_initialize(self):
    self._login()

def _login(self):
    (username, password) = self._get_login_info()
    if username is None:
        return

    login_form = {
        'username': username.encode('utf-8'),
        'password': password.encode('utf-8'),
        'remember': 'false',
        'stayPut': 'false'
    }
    request = compat_urllib_request.Request(
        self._LOGIN_URL, compat_urllib_parse.urlencode(login_form).encode('utf-8'))
    login_page = self._download_webpage(
        request, None, 'Logging in as %s' % username)

    # Not (yet) logged in
    m = re.search(r'loginResultJson = \'(?P<json>[^\']+)\';', login_page)
    if m is not None:
        response = m.group('json')
        response_json = json.loads(response)
        state = response_json['state']

        if state == 'notlogged':
            raise ExtractorError(
                'Unable to login, incorrect username and/or password',
                expected=True)

        # This is when we get popup:
        # > You're already logged in to lynda.com on two devices.
        # > If you log in here, we'll log you out of another device.
        # So, we need to confirm this.
        if state == 'conflicted':
            confirm_form = {
                'username': '',
                'password': '',
                'resolve': 'true',
                'remember': 'false',
                'stayPut': 'false',
            }
            request = compat_urllib_request.Request(
                self._LOGIN_URL, compat_urllib_parse.urlencode(confirm_form).encode('utf-8'))
            login_page = self._download_webpage(
                request, None,
                'Confirming log in and log out from another device')

    if re.search(self._SUCCESSFUL_LOGIN_REGEX, login_page) is None:
        raise ExtractorError('Unable to log in')

class LyndaIE(LyndaBaseIE): IE_NAME = 'lynda' IE_DESC = 'lynda.com videos' _VALID_URL = r'https?://www.lynda.com/(?:[^/]+/[^/]+/\d+|player/embed)/(?P\d+)' _NETRC_MACHINE = 'lynda'

_TIMECODE_REGEX = r'\[(?P<timecode>\d+:\d+:\d+[\.,]\d+)\]'

_TESTS = [{
    'url': 'http://www.lynda.com/Bootstrap-tutorials/Using-exercise-files/110885/114408-4.html',
    'md5': 'ecfc6862da89489161fb9cd5f5a6fac1',
    'info_dict': {
        'id': '114408',
        'ext': 'mp4',
        'title': 'Using the exercise files',
        'duration': 68
    }
}, {
    'url': 'https://www.lynda.com/player/embed/133770?tr=foo=1;bar=g;fizz=rt&fs=0',
    'only_matching': True,
}]

def _real_extract(self, url):
    video_id = self._match_id(url)

    page = self._download_webpage(
        'http://www.lynda.com/ajax/player?videoId=%s&type=video' % video_id,
        video_id, 'Downloading video JSON')
    video_json = json.loads(page)

    if 'Status' in video_json:
        raise ExtractorError(
            'lynda returned error: %s' % video_json['Message'], expected=True)

    if video_json['HasAccess'] is False:
        raise ExtractorError(
            'Video %s is only available for members. '
            % video_id + self._ACCOUNT_CREDENTIALS_HINT, expected=True)

    video_id = compat_str(video_json['ID'])
    duration = video_json['DurationInSeconds']
    title = video_json['Title']

    formats = []

    fmts = video_json.get('Formats')
    if fmts:
        formats.extend([
            {
                'url': fmt['Url'],
                'ext': fmt['Extension'],
                'width': fmt['Width'],
                'height': fmt['Height'],
                'filesize': fmt['FileSize'],
                'format_id': str(fmt['Resolution'])
            } for fmt in fmts])

    prioritized_streams = video_json.get('PrioritizedStreams')
    if prioritized_streams:
        formats.extend([
            {
                'url': video_url,
                'width': int_or_none(format_id),
                'format_id': format_id,
            } for format_id, video_url in prioritized_streams['0'].items()
        ])

    self._check_formats(formats, video_id)
    self._sort_formats(formats)

    subtitles = self.extract_subtitles(video_id, page)

    return {
        'id': video_id,
        'title': title,
        'duration': duration,
        'subtitles': subtitles,
        'formats': formats
    }

def _fix_subtitles(self, subs):
    srt = ''
    seq_counter = 0
    for pos in range(0, len(subs) - 1):
        seq_current = subs[pos]
        m_current = re.match(self._TIMECODE_REGEX, seq_current['Timecode'])
        if m_current is None:
            continue
        seq_next = subs[pos + 1]
        m_next = re.match(self._TIMECODE_REGEX, seq_next['Timecode'])
        if m_next is None:
            continue
        appear_time = m_current.group('timecode')
        disappear_time = m_next.group('timecode')
        text = seq_current['Caption'].strip()
        if text:
            seq_counter += 1
            srt += '%s\r\n%s --> %s\r\n%s\r\n\r\n' % (seq_counter, appear_time, disappear_time, text)
    if srt:
        return srt

def _get_subtitles(self, video_id, webpage):
    url = 'http://www.lynda.com/ajax/player?videoId=%s&type=transcript' % video_id
    subs = self._download_json(url, None, False)
    if subs:
        return {'en': [{'ext': 'srt', 'data': self._fix_subtitles(subs)}]}
    else:
        return {}

class LyndaCourseIE(LyndaBaseIE): IE_NAME = 'lynda:course' IE_DESC = 'lynda.com online courses'

# Course link equals to welcome/introduction video link of same course
# We will recognize it as course link
_VALID_URL = r'https?://(?:www|m)\.lynda\.com/(?P<coursepath>[^/]+/[^/]+/(?P<courseid>\d+))-\d\.html'

def _real_extract(self, url):
    mobj = re.match(self._VALID_URL, url)
    course_path = mobj.group('coursepath')
    course_id = mobj.group('courseid')

    page = self._download_webpage(
        'http://www.lynda.com/ajax/player?courseId=%s&type=course' % course_id,
        course_id, 'Downloading course JSON')
    course_json = json.loads(page)

    if 'Status' in course_json and course_json['Status'] == 'NotFound':
        raise ExtractorError(
            'Course %s does not exist' % course_id, expected=True)

    unaccessible_videos = 0
    videos = []

    # Might want to extract videos right here from video['Formats'] as it seems 'Formats' is not provided
    # by single video API anymore

    for chapter in course_json['Chapters']:
        for video in chapter['Videos']:
            if video['HasAccess'] is False:
                unaccessible_videos += 1
                continue
            videos.append(video['ID'])

    if unaccessible_videos > 0:
        self._downloader.report_warning(
            '%s videos are only available for members (or paid members) and will not be downloaded. '
            % unaccessible_videos + self._ACCOUNT_CREDENTIALS_HINT)

    entries = [
        self.url_result(
            'http://www.lynda.com/%s/%s-4.html' % (course_path, video_id),
            'Lynda')
        for video_id in videos]

    course_title = course_json['Title']

    return self.playlist_result(entries, course_id, course_title)
yan12125 commented 9 years ago

I don't have a Lynda account so I can't test it.

The lynda.py you're currently using is the version on Aug 5, or specifically, between commit 8a5601e42f6974e6694f01089b4c7e014b6a1b7a and 5b7dab2dd640c93ec0f63ca8b901e701679a4c7b. I'm not sure why there's an old file in the latest installation. A solution to this situation may be completely uninstalling youtube-dl and install again. Replacing a single file may work but not recommended as it causes inconsistency. If you're still going to do that, replace the file, delete all __pycache__ folders and *.pyc files, and youtube-dl will use the new version.

jaan143 commented 9 years ago

plz if you have skype then contact me skype: john.john4747 then you can come to my pc via teamviewer and check actual problem

yan12125 commented 9 years ago

I can't use skype as of now.

Well, could you try youtube-dl.exe downloaded from http://youtube-dl.org/downloads/2015.10.13/youtube-dl.exe? I think it would be more stable.

jaan143 commented 9 years ago

i just edit lynda account (sdfsdf@gmail.com) to hide here but in original error its show my main lynda account here is error

[lynda:course] Logging in as sdfsdf@gmail.com ERROR: Unable to log in; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see https://yt-dl.org/update on how to update. Be sure to call youtube-dl with the --verbose flag and include its com plete output. Traceback (most recent call last): File "C:\Python34\lib\site-packages\youtube_dl\YoutubeDL.py", line 660, in extract_info ie_result = ie.extract(url) File "C:\Python34\lib\site-packages\youtube_dl\extractor\common.py", line 289, in extract self.initialize() File "C:\Python34\lib\site-packages\youtube_dl\extractor\common.py", line 283, in initialize self._real_initialize() File "C:\Python34\lib\site-packages\youtube_dl\extractor\lynda.py", line 25, in _real_initialize self._login() File "C:\Python34\lib\site-packages\youtube_dl\extractor\lynda.py", line 74, in _login raise ExtractorError('Unable to log in') youtube_dl.utils.ExtractorError: Unable to log in; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see https://yt-dl.org/update on how to update. Be sure to call youtube-dl with the --verbos e flag and include its complete output.

PS C:\Users\waqas07\downloads>