diff --git a/m3u8/model.py b/m3u8/model.py
index 0b13349..5ca29d5 100644
--- a/m3u8/model.py
+++ b/m3u8/model.py
@@ -176,7 +176,7 @@ class M3U8(object):
                                          uri=ifr_pl['uri'],
                                          iframe_stream_info=ifr_pl['iframe_stream_info'])
                                         )
-        self.segment_map_uri = self.data.get('segment_map_uri')
+        self.segment_map = self.data.get('segment_map')
 
     def __unicode__(self):
         return self.dumps()
diff --git a/m3u8/parser.py b/m3u8/parser.py
index 5aa117e..f28fd07 100644
--- a/m3u8/parser.py
+++ b/m3u8/parser.py
@@ -137,7 +137,9 @@ def parse(content, strict=False):
             data['is_endlist'] = True
 
         elif line.startswith(protocol.ext_x_map):
-            data['segment_map_uri'] = _parse_segment_map_uri(line)
+            quoted_parser = remove_quotes_parser('uri')
+            segment_map_info = _parse_attribute_list(protocol.ext_x_map, line, quoted_parser)
+            data['segment_map'] = segment_map_info
 
         # Comments and whitespace
         elif line.startswith('#'):
@@ -310,14 +312,6 @@ def _parse_cueout_start(line, state, prevline):
         state['current_cue_out_duration'] = _cueout_state[1]
 
 
-def _parse_segment_map_uri(line):
-    """
-    :param line: '#EXT-X-MAP:URI="fileSequence0.mp4"'
-    :rtype: str 
-    """
-    return remove_quotes(line.replace(protocol.ext_x_map+':', '').split('=', 1)[1])
-
-
 def string_to_lines(string):
     return string.strip().replace('\r\n', '\n').split('\n')
 

Error parsing line #EXT-X-MAP:URI="main.mp4",BYTERANGE="812@0"
Apple 'Advanced stream (HEVC/H.264)' reference has #EXT-X-MAP:URI="main.mp4",BYTERANGE="812@0" attribute. This attribute parses as segment_map_uri with incorrect value 'main.mp4",BYTERANGE="812@0'. But should be parsed as separate 'uri' and 'byterange'.

Link to m3u8:
https://tungsten.aaplimg.com/VOD/bipbop_adv_example_hevc/tp10/iframe_index.m3u8

Link to examples:
https://developer.apple.com/streaming/examples/
diff --git a/tests/playlists.py b/tests/playlists.py
index 8bb85be..8f06a0b 100755
--- a/tests/playlists.py
+++ b/tests/playlists.py
@@ -607,6 +607,15 @@ MAP_URI_PLAYLIST = '''#EXTM3U
 #EXT-X-MAP:URI="fileSequence0.mp4"
 '''
 
+MAP_URI_PLAYLIST_WITH_BYTERANGE = '''#EXTM3U
+#EXT-X-TARGETDURATION:2
+#EXT-X-VERSION:7
+#EXT-X-MEDIA-SEQUENCE:1
+#EXT-X-PLAYLIST-TYPE:VOD
+#EXT-X-INDEPENDENT-SEGMENTS
+#EXT-X-MAP:URI="main.mp4",BYTERANGE="812@0"
+'''
+
 RELATIVE_PLAYLIST_FILENAME = abspath(join(dirname(__file__), 'playlists/relative-playlist.m3u8'))
 
 RELATIVE_PLAYLIST_URI = TEST_HOST + '/path/to/relative-playlist.m3u8'
diff --git a/tests/test_model.py b/tests/test_model.py
index f4e985a..502144c 100755
--- a/tests/test_model.py
+++ b/tests/test_model.py
@@ -692,11 +692,16 @@ def test_m3u8_should_propagate_base_uri_to_key():
 
 def test_segment_map_uri_attribute():
     obj = m3u8.M3U8(playlists.MAP_URI_PLAYLIST)
-    assert obj.segment_map_uri == "fileSequence0.mp4"
+    assert obj.segment_map['uri'] == "fileSequence0.mp4"
 
 
+def test_segment_map_uri_attribute_with_byterange():
+    obj = m3u8.M3U8(playlists.MAP_URI_PLAYLIST_WITH_BYTERANGE)
+    assert obj.segment_map['uri'] == "main.mp4"
+
 # custom asserts
 
+
 def assert_file_content(filename, expected):
     with open(filename) as fileobj:
         content = fileobj.read().strip()
diff --git a/tests/test_parser.py b/tests/test_parser.py
index 7a77ecb..47676f9 100644
--- a/tests/test_parser.py
+++ b/tests/test_parser.py
@@ -255,4 +255,9 @@ def test_commaless_extinf_strict():
 
 def test_should_parse_segment_map_uri():
     data = m3u8.parse(playlists.MAP_URI_PLAYLIST)
-    assert data['segment_map_uri'] == "fileSequence0.mp4"
+    assert data['segment_map']['uri'] == "fileSequence0.mp4"
+
+
+def test_should_parse_segment_map_uri_with_byterange():
+    data = m3u8.parse(playlists.MAP_URI_PLAYLIST_WITH_BYTERANGE)
+    assert data['segment_map']['uri'] == "main.mp4"

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov
3.9
requirements.txt requirements-dev.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
arrow==1.3.0
bottle==0.13.2
certifi==2025.1.31
charset-normalizer==3.4.1
coverage==7.8.0
exceptiongroup==1.2.2
idna==3.10
iniconfig==2.1.0
iso8601==2.1.0
-e git+https://github.com/globocom/m3u8.git@e58a2411b7df376adb922cf56bc411d55e371e77#egg=m3u8
packaging==24.2
pluggy==1.5.0
pytest==8.3.5
pytest-cov==6.0.0
python-coveralls==2.9.3
python-dateutil==2.9.0.post0
PyYAML==6.0.2
requests==2.32.3
six==1.17.0
tomli==2.2.1
types-python-dateutil==2.9.0.20241206
urllib3==2.3.0

name: m3u8
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - arrow==1.3.0
      - bottle==0.13.2
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - coverage==7.8.0
      - exceptiongroup==1.2.2
      - idna==3.10
      - iniconfig==2.1.0
      - iso8601==2.1.0
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - pytest-cov==6.0.0
      - python-coveralls==2.9.3
      - python-dateutil==2.9.0.post0
      - pyyaml==6.0.2
      - requests==2.32.3
      - six==1.17.0
      - tomli==2.2.1
      - types-python-dateutil==2.9.0.20241206
      - urllib3==2.3.0
prefix: /opt/conda/envs/m3u8

tests/test_model.py::test_segment_map_uri_attribute tests/test_model.py::test_segment_map_uri_attribute_with_byterange tests/test_parser.py::test_should_parse_segment_map_uri tests/test_parser.py::test_should_parse_segment_map_uri_with_byterange
tests/test_model.py::test_target_duration_attribute tests/test_model.py::test_media_sequence_attribute tests/test_model.py::test_program_date_time_attribute tests/test_model.py::test_program_date_time_attribute_for_each_segment tests/test_model.py::test_program_date_time_attribute_with_discontinuity tests/test_model.py::test_segment_discontinuity_attribute tests/test_model.py::test_segment_cue_out_attribute tests/test_model.py::test_segment_elemental_scte35_attribute tests/test_model.py::test_segment_envivio_scte35_attribute tests/test_model.py::test_keys_on_clear_playlist tests/test_model.py::test_keys_on_simple_encrypted_playlist tests/test_model.py::test_key_attribute tests/test_model.py::test_key_attribute_on_none tests/test_model.py::test_key_attribute_without_initialization_vector tests/test_model.py::test_segments_attribute tests/test_model.py::test_segments_attribute_without_title tests/test_model.py::test_segments_attribute_without_duration tests/test_model.py::test_segments_attribute_with_byterange tests/test_model.py::test_segment_attribute_with_multiple_keys tests/test_model.py::test_is_variant_attribute tests/test_model.py::test_is_endlist_attribute tests/test_model.py::test_is_i_frames_only_attribute tests/test_model.py::test_playlists_attribute tests/test_model.py::test_playlists_attribute_without_program_id tests/test_model.py::test_playlists_attribute_with_resolution tests/test_model.py::test_iframe_playlists_attribute tests/test_model.py::test_version_attribute tests/test_model.py::test_allow_cache_attribute tests/test_model.py::test_files_attribute_should_list_all_files_including_segments_and_key tests/test_model.py::test_vod_playlist_type_should_be_imported_as_a_simple_attribute tests/test_model.py::test_event_playlist_type_should_be_imported_as_a_simple_attribute tests/test_model.py::test_independent_segments_should_be_true tests/test_model.py::test_independent_segments_should_be_false tests/test_model.py::test_no_playlist_type_leaves_attribute_empty tests/test_model.py::test_dump_playlists_with_resolution tests/test_model.py::test_dump_should_build_file_with_same_content tests/test_model.py::test_dump_should_create_sub_directories tests/test_model.py::test_dump_should_work_for_variant_streams tests/test_model.py::test_dump_should_work_for_variant_playlists_with_iframe_playlists tests/test_model.py::test_dump_should_work_for_iframe_playlists tests/test_model.py::test_dump_should_include_program_date_time tests/test_model.py::test_dump_should_work_for_playlists_using_byteranges tests/test_model.py::test_should_dump_with_endlist_tag tests/test_model.py::test_should_dump_without_endlist_tag tests/test_model.py::test_should_dump_multiple_keys tests/test_model.py::test_should_dump_unencrypted_encrypted_keys_together tests/test_model.py::test_should_dump_complex_unencrypted_encrypted_keys tests/test_model.py::test_should_dump_complex_unencrypted_encrypted_keys_no_uri_attr tests/test_model.py::test_length_segments_by_key tests/test_model.py::test_list_segments_by_key tests/test_model.py::test_replace_segment_key tests/test_model.py::test_should_dump_program_datetime_and_discontinuity tests/test_model.py::test_should_normalize_segments_and_key_urls_if_base_path_passed_to_constructor tests/test_model.py::test_should_normalize_variant_streams_urls_if_base_path_passed_to_constructor tests/test_model.py::test_should_normalize_segments_and_key_urls_if_base_path_attribute_updated tests/test_model.py::test_playlist_type_dumped_to_appropriate_m3u8_field tests/test_model.py::test_empty_playlist_type_is_gracefully_ignored tests/test_model.py::test_none_playlist_type_is_gracefully_ignored tests/test_model.py::test_0_media_sequence_added_to_file tests/test_model.py::test_none_media_sequence_gracefully_ignored tests/test_model.py::test_should_correctly_update_base_path_if_its_blank tests/test_model.py::test_m3u8_should_propagate_base_uri_to_segments tests/test_model.py::test_m3u8_should_propagate_base_uri_to_key tests/test_parser.py::test_should_parse_simple_playlist_from_string tests/test_parser.py::test_should_parse_non_integer_duration_from_playlist_string tests/test_parser.py::test_should_parse_simple_playlist_from_string_with_different_linebreaks tests/test_parser.py::test_should_parse_sliding_window_playlist_from_string tests/test_parser.py::test_should_parse_playlist_with_encripted_segments_from_string tests/test_parser.py::test_should_load_playlist_with_iv_from_string tests/test_parser.py::test_should_add_key_attribute_to_segment_from_playlist tests/test_parser.py::test_should_add_non_key_for_multiple_keys_unencrypted_and_encrypted tests/test_parser.py::test_should_handle_key_method_none_and_no_uri_attr tests/test_parser.py::test_should_parse_title_from_playlist tests/test_parser.py::test_should_parse_variant_playlist tests/test_parser.py::test_should_parse_variant_playlist_with_average_bandwidth tests/test_parser.py::test_should_parse_variant_playlist_with_bandwidth_as_float tests/test_parser.py::test_should_parse_variant_playlist_with_iframe_playlists tests/test_parser.py::test_should_parse_variant_playlist_with_alt_iframe_playlists_layout tests/test_parser.py::test_should_parse_iframe_playlist tests/test_parser.py::test_should_parse_playlist_using_byteranges tests/test_parser.py::test_should_parse_endlist_playlist tests/test_parser.py::test_should_parse_ALLOW_CACHE tests/test_parser.py::test_should_parse_VERSION tests/test_parser.py::test_should_parse_program_date_time_from_playlist tests/test_parser.py::test_should_parse_scte35_from_playlist tests/test_parser.py::test_should_parse_envivio_cue_playlist tests/test_parser.py::test_parse_simple_playlist_messy tests/test_parser.py::test_parse_simple_playlist_messy_strict tests/test_parser.py::test_commaless_extinf tests/test_parser.py::test_commaless_extinf_strict
m3u8/model.py m3u8/parser.py
m3u8/model.py m3u8/parser.py