Ejemplo n.º 1
0
    def process_status_line(klass, video, line):
        error = klass._check_for_errors(line)
        if error:
            return {'finished': True, 'error': error}

        match = klass.DURATION_RE.match(line)
        if match is not None:
            hours, minutes, seconds, centi = [
                int(m) for m in match.groups()[:4]
            ]
            return {
                'duration': hms_to_seconds(hours, minutes,
                                           seconds + 0.01 * centi)
            }

        match = klass.PROGRESS_RE.match(line)
        if match is not None:
            t = match.group(1)
            if ':' in t:
                hours, minutes, seconds = [float(m) for m in t.split(':')[:3]]
                return {'progress': hms_to_seconds(hours, minutes, seconds)}
            else:
                return {'progress': float(t)}

        match = klass.LAST_PROGRESS_RE.match(line)
        if match is not None:
            return {'finished': True}
Ejemplo n.º 2
0
    def process_status_line(klass, video, line):
        error = klass._check_for_errors(line)
        if error:
            return {'finished': True, 'error': error}

        match = klass.DURATION_RE.match(line)
        if match is not None:
            hours, minutes, seconds, centi = [
                int(m) for m in match.groups()[:4]]
            return {'duration': hms_to_seconds(hours, minutes,
                                               seconds + 0.01 * centi)}

        match = klass.FIRST_PASS.match(line)
        if match is not None:
            t = match.group(1)
            if ':' in t:
                hours, minutes, seconds = [float(m) for m in t.split(':')[:3]]
                return {'pass1': hms_to_seconds(hours, minutes, seconds)}
            else:
                return {'pass1': float(t)}

        match = klass.PROGRESS_RE.match(line)
        if match is not None:
            t = match.group(1)
            if ':' in t:
                hours, minutes, seconds = [float(m) for m in t.split(':')[:3]]
                return {'pass2': hms_to_seconds(hours, minutes, seconds)}
            else:
                return {'pass2': float(t)}

        match = klass.LAST_PROGRESS_RE.match(line)
        if match is not None:
            return {'finished': True}
Ejemplo n.º 3
0
    def process_status_line(klass, video, line):
        error = klass._check_for_errors(line)
        if error:
            return {"finished": True, "error": error}

        match = klass.DURATION_RE.match(line)
        if match is not None:
            hours, minutes, seconds, centi = [int(m) for m in match.groups()[:4]]
            return {"duration": hms_to_seconds(hours, minutes, seconds + 0.01 * centi)}

        match = klass.PROGRESS_RE.match(line)
        if match is not None:
            t = match.group(1)
            if ":" in t:
                hours, minutes, seconds = [float(m) for m in t.split(":")[:3]]
                return {"progress": hms_to_seconds(hours, minutes, seconds)}
            else:
                return {"progress": float(t)}

        match = klass.LAST_PROGRESS_RE.match(line)
        if match is not None:
            return {"finished": True}
Ejemplo n.º 4
0
 def test_hms_to_seconds(self):
     self.assertEqual(utils.hms_to_seconds(3, 2, 1),
                      3 * 3600 +
                      2 * 60 +
                      1)
Ejemplo n.º 5
0
 def test_hms_to_seconds_floats(self):
     self.assertEqual(utils.hms_to_seconds(3.0, 2.0, 1.5),
                      3 * 3600 +
                      2 * 60 +
                      1.5)
 def test_hms_to_seconds(self):
     self.assertEqual(utils.hms_to_seconds(3, 2, 1), 3 * 3600 + 2 * 60 + 1)
 def test_hms_to_seconds_floats(self):
     self.assertEqual(utils.hms_to_seconds(3.0, 2.0, 1.5),
                      3 * 3600 + 2 * 60 + 1.5)
def extract_info(ast):
    info = {}
    # logging.info("get_media_info: %s", ast.pformat())

    input0 = ast.get_by_key("Input #0")
    if not input0:
        raise ValueError("no input #0")

    foo, info['container'], bar = input0.line.split(', ', 2)
    if ',' in info['container']:
        info['container'] = info['container'].split(',')

    metadata = input0.get_by_key("Metadata")
    if metadata:
        for key in ('title', 'artist', 'album', 'track', 'genre'):
            node = metadata.get_by_key(key)
            if node:
                info[key] = node.line.split(':', 1)[1].strip()
        major_brand_node = metadata.get_by_key("major_brand")
        extra_container_types = []
        if major_brand_node:
            major_brand = major_brand_node.line.split(':')[1].strip()
            extra_container_types = [major_brand]
        else:
            major_brand = None

        compatible_brands_node = metadata.get_by_key("compatible_brands")
        if compatible_brands_node:
            line = compatible_brands_node.line.split(':')[1].strip()
            extra_container_types.extend(line[i:i + 4]
                                         for i in range(0, len(line), 4)
                                         if line[i:i + 4] != major_brand)

        if extra_container_types:
            if not isinstance(info['container'], list):
                info['container'] = [info['container']]
            info['container'].extend(extra_container_types)

    duration = input0.get_by_key("Duration:")
    if duration:
        _, rest = duration.line.split(':', 1)
        duration_string, _ = rest.split(', ', 1)
        logging.info("duration: %r", duration_string)
        try:
            hours, minutes, seconds = [
                float(i) for i in duration_string.split(':')
            ]
        except ValueError:
            if duration_string.strip() != "N/A":
                logging.warn("Error parsing duration string: %r",
                             duration_string)
        else:
            info['duration'] = hms_to_seconds(hours, minutes, seconds)
        for stream_node in duration.children:
            stream = stream_node.line
            if "Video:" in stream:
                stream_number, video, data = stream.split(': ', 2)
                video_codec = data.split(', ')[0]
                if ' ' in video_codec:
                    video_codec, drmp = video_codec.split(' ', 1)
                    if 'drm' in drmp:
                        info.setdefault('has_drm', []).append('video')
                info['video_codec'] = video_codec
                match = SIZE_RE.search(data)
                if match:
                    info["width"] = int(match.group(1))
                    info["height"] = int(match.group(2))
            elif 'Audio:' in stream:
                stream_number, video, data = stream.split(': ', 2)
                audio_codec = data.split(', ')[0]
                if ' ' in audio_codec:
                    audio_codec, drmp = audio_codec.split(' ', 1)
                    if 'drm' in drmp:
                        info.setdefault('has_drm', []).append('audio')
                info['audio_codec'] = audio_codec
    return info
Ejemplo n.º 9
0
def extract_info(ast):
    info = {}
    # logging.info("get_media_info: %s", ast.pformat())

    input0 = ast.get_by_key("Input #0")
    if not input0:
        raise ValueError("no input #0")

    foo, info['container'], bar = input0.line.split(', ', 2)
    if ',' in info['container']:
        info['container'] = info['container'].split(',')

    metadata = input0.get_by_key("Metadata")
    if metadata:
        for key in ('title', 'artist', 'album', 'track', 'genre'):
            node = metadata.get_by_key(key)
            if node:
                info[key] = node.line.split(':', 1)[1].strip()
        major_brand_node = metadata.get_by_key("major_brand")
        extra_container_types = []
        if major_brand_node:
            major_brand = major_brand_node.line.split(':')[1].strip()
            extra_container_types = [major_brand]
        else:
            major_brand = None

        compatible_brands_node = metadata.get_by_key("compatible_brands")
        if compatible_brands_node:
            line = compatible_brands_node.line.split(':')[1].strip()
            extra_container_types.extend(line[i:i+4] for i in range(0, len(line), 4)
                                         if line[i:i+4] != major_brand)

        if extra_container_types:
            if not isinstance(info['container'], list):
                info['container'] = [info['container']]
            info['container'].extend(extra_container_types)

    duration = input0.get_by_key("Duration:")
    if duration:
        _, rest = duration.line.split(':', 1)
        duration_string, _ = rest.split(', ', 1)
        hours, minutes, seconds = [
            float(i) for i in duration_string.split(':')]
        info['duration'] = hms_to_seconds(hours, minutes, seconds)
        for stream_node in duration.children:
            stream = stream_node.line
            if "Video:" in stream:
                stream_number, video, data = stream.split(': ', 2)
                video_codec = data.split(', ')[0]
                if ' ' in video_codec:
                    video_codec, drmp = video_codec.split(' ', 1)
                    if 'drm' in drmp:
                        info.setdefault('has_drm', []).append('video')
                info['video_codec'] = video_codec
                match = SIZE_RE.search(data)
                if match:
                    info["width"] = int(match.group(1))
                    info["height"] = int(match.group(2))
            elif 'Audio:' in stream:
                stream_number, video, data = stream.split(': ', 2)
                audio_codec = data.split(', ')[0]
                if ' ' in audio_codec:
                    audio_codec, drmp = audio_codec.split(' ', 1)
                    if 'drm' in drmp:
                        info.setdefault('has_drm', []).append('audio')
                info['audio_codec'] = audio_codec
    return info