Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lynda.com unable to log in #6462

Closed
matt-the-ogre opened this issue Aug 4, 2015 · 16 comments
Closed

Lynda.com unable to log in #6462

matt-the-ogre opened this issue Aug 4, 2015 · 16 comments

Comments

@matt-the-ogre
Copy link

@matt-the-ogre matt-the-ogre commented Aug 4, 2015

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
Copy link
Collaborator

@dstftw dstftw commented Aug 5, 2015

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

@dstftw dstftw closed this Aug 5, 2015
dstftw added a commit that referenced this issue Aug 5, 2015
@jaan143
Copy link

@jaan143 jaan143 commented Oct 14, 2015

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
Copy link
Collaborator

@yan12125 yan12125 commented Oct 14, 2015

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
Copy link

@jaan143 jaan143 commented Oct 14, 2015

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
Copy link
Collaborator

@yan12125 yan12125 commented Oct 14, 2015

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

@jaan143
Copy link

@jaan143 jaan143 commented Oct 14, 2015

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
Copy link
Collaborator

@yan12125 yan12125 commented Oct 14, 2015

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
Copy link

@jaan143 jaan143 commented Oct 14, 2015

yes its showing
2015.10.13

@jaan143
Copy link

@jaan143 jaan143 commented Oct 15, 2015

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

@yan12125
Copy link
Collaborator

@yan12125 yan12125 commented Oct 15, 2015

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
Copy link

@jaan143 jaan143 commented Oct 15, 2015

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
Copy link

@jaan143 jaan143 commented Oct 15, 2015

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_LOGIN_REGEX = 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
Copy link
Collaborator

@yan12125 yan12125 commented Oct 15, 2015

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 8a5601e and 5b7dab2. 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
Copy link

@jaan143 jaan143 commented Oct 15, 2015

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
Copy link
Collaborator

@yan12125 yan12125 commented Oct 15, 2015

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
Copy link

@jaan143 jaan143 commented Oct 15, 2015

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>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
4 participants
You can’t perform that action at this time.