diff --git a/tinytag/tinytag.py b/tinytag/tinytag.py
index a3f1305..595a101 100644
--- a/tinytag/tinytag.py
+++ b/tinytag/tinytag.py
@@ -170,40 +170,48 @@ class TinyTag(object):
                 return parser
 
     @classmethod
-    def get_parser_class(cls, filename, filehandle):
+    def get_parser_class(cls, filename=None, filehandle=None):
         if cls != TinyTag:  # if `get` is invoked on TinyTag, find parser by ext
             return cls  # otherwise use the class on which `get` was invoked
-        parser_class = cls._get_parser_for_filename(filename)
-        if parser_class is not None:
-            return parser_class
+        if filename:
+            parser_class = cls._get_parser_for_filename(filename)
+            if parser_class is not None:
+                return parser_class
         # try determining the file type by magic byte header
-        parser_class = cls._get_parser_for_file_handle(filehandle)
-        if parser_class is not None:
-            return parser_class
+        if filehandle:
+            parser_class = cls._get_parser_for_file_handle(filehandle)
+            if parser_class is not None:
+                return parser_class
         raise TinyTagException('No tag reader found to support filetype! ')
 
     @classmethod
-    def get(cls, filename, tags=True, duration=True, image=False, ignore_errors=False,
-            encoding=None):
-        try:  # cast pathlib.Path to str
-            import pathlib
-            if isinstance(filename, pathlib.Path):
-                filename = str(filename.absolute())
-        except ImportError:
-            pass
+    def get(cls, filename=None, tags=True, duration=True, image=False,
+            ignore_errors=False, encoding=None, file_obj=None):
+        should_open_file = (file_obj is None)
+        if should_open_file:
+            try:
+                file_obj = io.open(filename, 'rb')
+            except TypeError:
+                file_obj = io.open(str(filename.absolute()), 'rb')  # Python 3.4/3.5 pathlib support
+            filename = file_obj.name
         else:
-            filename = os.path.expanduser(filename)
-        size = os.path.getsize(filename)
-        if not size > 0:
-            return TinyTag(None, 0)
-        with io.open(filename, 'rb') as af:
-            parser_class = cls.get_parser_class(filename, af)
-            tag = parser_class(af, size, ignore_errors=ignore_errors)
+            file_obj = io.BufferedReader(file_obj)  # buffered reader to support peeking
+        try:
+            file_obj.seek(0, os.SEEK_END)
+            filesize = file_obj.tell()
+            file_obj.seek(0)
+            if filesize <= 0:
+                return TinyTag(None, filesize)
+            parser_class = cls.get_parser_class(filename, file_obj)
+            tag = parser_class(file_obj, filesize, ignore_errors=ignore_errors)
             tag._filename = filename
             tag._default_encoding = encoding
             tag.load(tags=tags, duration=duration, image=image)
             tag.extra = dict(tag.extra)  # turn default dict into dict so that it can throw KeyError
             return tag
+        finally:
+            if should_open_file:
+                file_obj.close()
 
     def __str__(self):
         return json.dumps(OrderedDict(sorted(self.as_dict().items())))

diff --git a/tinytag/tests/test_all.py b/tinytag/tests/test_all.py
index 0b70517..aa3a38e 100644
--- a/tinytag/tests/test_all.py
+++ b/tinytag/tests/test_all.py
@@ -510,6 +510,13 @@ def test_pathlib_compatibility():
     TinyTag.get(filename)
 
 
+def test_bytesio_compatibility():
+    testfile = next(iter(testfiles.keys()))
+    filename = os.path.join(testfolder, testfile)
+    with io.open(filename, 'rb') as file_handle:
+        TinyTag.get(file_obj=io.BytesIO(file_handle.read()))
+
+
 @pytest.mark.skipif(sys.platform == "win32", reason='Windows does not support binary paths')
 def test_binary_path_compatibility():
     binary_file_path = os.path.join(os.path.dirname(__file__).encode('utf-8'), b'\x01.mp3')

Support BytesIo objects for tagging
It would be awesome to support BytesIO or any other IO types with TinyTag. This way it can be used in some scenarios where files are packaged and do not have a normal path.
tinytag/tests/test_all.py::test_bytesio_compatibility
tinytag/tests/test_all.py::test_file_reading[samples/vbri.mp3-expected0] tinytag/tests/test_all.py::test_file_reading[samples/cbr.mp3-expected1] tinytag/tests/test_all.py::test_file_reading[samples/vbr_xing_header.mp3-expected2] tinytag/tests/test_all.py::test_file_reading[samples/vbr_xing_header_2channel.mp3-expected3] tinytag/tests/test_all.py::test_file_reading[samples/id3v22-test.mp3-expected4] tinytag/tests/test_all.py::test_file_reading[samples/silence-44-s-v1.mp3-expected5] tinytag/tests/test_all.py::test_file_reading[samples/id3v1-latin1.mp3-expected6] tinytag/tests/test_all.py::test_file_reading[samples/UTF16.mp3-expected7] tinytag/tests/test_all.py::test_file_reading[samples/utf-8-id3v2.mp3-expected8] tinytag/tests/test_all.py::test_file_reading[samples/empty_file.mp3-expected9] tinytag/tests/test_all.py::test_file_reading[samples/silence-44khz-56k-mono-1s.mp3-expected10] tinytag/tests/test_all.py::test_file_reading[samples/silence-22khz-mono-1s.mp3-expected11] tinytag/tests/test_all.py::test_file_reading[samples/id3v24-long-title.mp3-expected12] tinytag/tests/test_all.py::test_file_reading[samples/utf16be.mp3-expected13] tinytag/tests/test_all.py::test_file_reading[samples/id3v22_image.mp3-expected14] tinytag/tests/test_all.py::test_file_reading[samples/id3v22.TCO.genre.mp3-expected15] tinytag/tests/test_all.py::test_file_reading[samples/id3_comment_utf_16_with_bom.mp3-expected16] tinytag/tests/test_all.py::test_file_reading[samples/id3_comment_utf_16_double_bom.mp3-expected17] tinytag/tests/test_all.py::test_file_reading[samples/id3_genre_id_out_of_bounds.mp3-expected18] tinytag/tests/test_all.py::test_file_reading[samples/image-text-encoding.mp3-expected19] tinytag/tests/test_all.py::test_file_reading[samples/id3v1_does_not_overwrite_id3v2.mp3-expected20] tinytag/tests/test_all.py::test_file_reading[samples/nicotinetestdata.mp3-expected21] tinytag/tests/test_all.py::test_file_reading[samples/chinese_id3.mp3-expected22] tinytag/tests/test_all.py::test_file_reading[samples/cut_off_titles.mp3-expected23] tinytag/tests/test_all.py::test_file_reading[samples/id3_xxx_lang.mp3-expected24] tinytag/tests/test_all.py::test_file_reading[samples/mp3/vbr/vbr8.mp3-expected25] tinytag/tests/test_all.py::test_file_reading[samples/mp3/vbr/vbr8stereo.mp3-expected26] tinytag/tests/test_all.py::test_file_reading[samples/mp3/vbr/vbr11.mp3-expected27] tinytag/tests/test_all.py::test_file_reading[samples/mp3/vbr/vbr11stereo.mp3-expected28] tinytag/tests/test_all.py::test_file_reading[samples/mp3/vbr/vbr16.mp3-expected29] tinytag/tests/test_all.py::test_file_reading[samples/mp3/vbr/vbr16stereo.mp3-expected30] tinytag/tests/test_all.py::test_file_reading[samples/mp3/vbr/vbr22.mp3-expected31] tinytag/tests/test_all.py::test_file_reading[samples/mp3/vbr/vbr22stereo.mp3-expected32] tinytag/tests/test_all.py::test_file_reading[samples/mp3/vbr/vbr32.mp3-expected33] tinytag/tests/test_all.py::test_file_reading[samples/mp3/vbr/vbr32stereo.mp3-expected34] tinytag/tests/test_all.py::test_file_reading[samples/mp3/vbr/vbr44.mp3-expected35] tinytag/tests/test_all.py::test_file_reading[samples/mp3/vbr/vbr44stereo.mp3-expected36] tinytag/tests/test_all.py::test_file_reading[samples/mp3/vbr/vbr48.mp3-expected37] tinytag/tests/test_all.py::test_file_reading[samples/mp3/vbr/vbr48stereo.mp3-expected38] tinytag/tests/test_all.py::test_file_reading[samples/id3v24_genre_null_byte.mp3-expected39] tinytag/tests/test_all.py::test_file_reading[samples/vbr_xing_header_short.mp3-expected40] tinytag/tests/test_all.py::test_file_reading[samples/empty.ogg-expected41] tinytag/tests/test_all.py::test_file_reading[samples/multipagecomment.ogg-expected42] tinytag/tests/test_all.py::test_file_reading[samples/multipage-setup.ogg-expected43] tinytag/tests/test_all.py::test_file_reading[samples/test.ogg-expected44] tinytag/tests/test_all.py::test_file_reading[samples/corrupt_metadata.ogg-expected45] tinytag/tests/test_all.py::test_file_reading[samples/composer.ogg-expected46] tinytag/tests/test_all.py::test_file_reading[samples/test.opus-expected47] tinytag/tests/test_all.py::test_file_reading[samples/8khz_5s.opus-expected48] tinytag/tests/test_all.py::test_file_reading[samples/test.wav-expected49] tinytag/tests/test_all.py::test_file_reading[samples/test3sMono.wav-expected50] tinytag/tests/test_all.py::test_file_reading[samples/test-tagged.wav-expected51] tinytag/tests/test_all.py::test_file_reading[samples/test-riff-tags.wav-expected52] tinytag/tests/test_all.py::test_file_reading[samples/silence-22khz-mono-1s.wav-expected53] tinytag/tests/test_all.py::test_file_reading[samples/id3_header_with_a_zero_byte.wav-expected54] tinytag/tests/test_all.py::test_file_reading[samples/adpcm.wav-expected55] tinytag/tests/test_all.py::test_file_reading[samples/riff_extra_zero.wav-expected56] tinytag/tests/test_all.py::test_file_reading[samples/riff_extra_zero_2.wav-expected57] tinytag/tests/test_all.py::test_file_reading[samples/flac1sMono.flac-expected58] tinytag/tests/test_all.py::test_file_reading[samples/flac453sStereo.flac-expected59] tinytag/tests/test_all.py::test_file_reading[samples/flac1.5sStereo.flac-expected60] tinytag/tests/test_all.py::test_file_reading[samples/flac_application.flac-expected61] tinytag/tests/test_all.py::test_file_reading[samples/no-tags.flac-expected62] tinytag/tests/test_all.py::test_file_reading[samples/variable-block.flac-expected63] tinytag/tests/test_all.py::test_file_reading[samples/106-invalid-streaminfo.flac-expected64] tinytag/tests/test_all.py::test_file_reading[samples/106-short-picture-block-size.flac-expected65] tinytag/tests/test_all.py::test_file_reading[samples/with_id3_header.flac-expected66] tinytag/tests/test_all.py::test_file_reading[samples/with_padded_id3_header.flac-expected67] tinytag/tests/test_all.py::test_file_reading[samples/with_padded_id3_header2.flac-expected68] tinytag/tests/test_all.py::test_file_reading[samples/flac_with_image.flac-expected69] tinytag/tests/test_all.py::test_file_reading[samples/test2.wma-expected70] tinytag/tests/test_all.py::test_file_reading[samples/lossless.wma-expected71] tinytag/tests/test_all.py::test_file_reading[samples/test.m4a-expected72] tinytag/tests/test_all.py::test_file_reading[samples/test2.m4a-expected73] tinytag/tests/test_all.py::test_file_reading[samples/iso8859_with_image.m4a-expected74] tinytag/tests/test_all.py::test_file_reading[samples/alac_file.m4a-expected75] tinytag/tests/test_all.py::test_file_reading[samples/mpeg4_desc_cmt.m4a-expected76] tinytag/tests/test_all.py::test_file_reading[samples/mpeg4_xa9des.m4a-expected77] tinytag/tests/test_all.py::test_file_reading[samples/test-tagged.aiff-expected78] tinytag/tests/test_all.py::test_file_reading[samples/test.aiff-expected79] tinytag/tests/test_all.py::test_file_reading[samples/pluck-pcm8.aiff-expected80] tinytag/tests/test_all.py::test_file_reading[samples/M1F1-mulawC-AFsp.afc-expected81] tinytag/tests/test_all.py::test_file_reading[samples/invalid_sample_rate.aiff-expected82] tinytag/tests/test_all.py::test_pathlib_compatibility tinytag/tests/test_all.py::test_binary_path_compatibility tinytag/tests/test_all.py::test_override_encoding tinytag/tests/test_all.py::test_mp3_length_estimation tinytag/tests/test_all.py::test_unpad tinytag/tests/test_all.py::test_mp3_image_loading tinytag/tests/test_all.py::test_mp3_id3v22_image_loading tinytag/tests/test_all.py::test_mp3_image_loading_without_description tinytag/tests/test_all.py::test_mp3_image_loading_with_utf8_description tinytag/tests/test_all.py::test_mp3_image_loading2 tinytag/tests/test_all.py::test_mp3_utf_8_invalid_string_raises_exception tinytag/tests/test_all.py::test_mp3_utf_8_invalid_string_can_be_ignored tinytag/tests/test_all.py::test_mp4_image_loading tinytag/tests/test_all.py::test_flac_image_loading tinytag/tests/test_all.py::test_ogg_image_loading tinytag/tests/test_all.py::test_aiff_image_loading tinytag/tests/test_all.py::test_detect_magic_headers[samples/detect_mp3_id3.x-ID3] tinytag/tests/test_all.py::test_detect_magic_headers[samples/detect_mp3_fffb.x-ID3] tinytag/tests/test_all.py::test_detect_magic_headers[samples/detect_ogg.x-Ogg] tinytag/tests/test_all.py::test_detect_magic_headers[samples/detect_wav.x-Wave] tinytag/tests/test_all.py::test_detect_magic_headers[samples/detect_flac.x-Flac] tinytag/tests/test_all.py::test_detect_magic_headers[samples/detect_wma.x-Wma] tinytag/tests/test_all.py::test_detect_magic_headers[samples/detect_mp4_m4a.x-MP4] tinytag/tests/test_all.py::test_detect_magic_headers[samples/detect_aiff.x-Aiff] tinytag/tests/test_all.py::test_show_hint_for_wrong_usage tinytag/tests/test_all.py::test_to_str