Skip to content

Commit acda39c

Browse files
committed
refactoring
1 parent a07731d commit acda39c

6 files changed

+119
-120
lines changed

AlbumArtExtraction/AlbumArtExtraction.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
</ItemGroup>
4141
<ItemGroup>
4242
<Compile Include="DirectoryAlbumArtExtractor.cs" />
43-
<Compile Include="Helper.cs" />
43+
<Compile Include="StreamExtensions.cs" />
4444
<Compile Include="IAlbumArtExtractor.cs" />
4545
<Compile Include="FlacAlbumArtExtractor.cs" />
4646
<Compile Include="ID3v22AlbumArtExtractor.cs" />

AlbumArtExtraction/FlacAlbumArtExtractor.cs

+16-19
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,25 @@ public class FlacAlbumArtExtractor : IAlbumArtExtractor {
1313
/// </summary>
1414
/// <param name="stream">対象の Stream</param>
1515
private MetaData _ReadMetaDataBlock(Stream stream) {
16-
var isLastAndMetaDataType = Helper.ReadAsByte(stream);
16+
var isLastAndMetaDataType = stream.ReadAsByte();
1717

1818
// これが最後のメタデータブロックかどうかを示す値
1919
var isLast = (isLastAndMetaDataType & 0x80U) != 0;
2020

2121
var metaDataType = (isLastAndMetaDataType & 0x7FU);
2222

23-
var metaDataLength = Helper.ReadAsUInt(stream, 3);
23+
var metaDataLength = stream.ReadAsUInt(3);
2424
if (metaDataLength == 0)
2525
throw new InvalidDataException("metaDataLength が不正です");
2626

2727
// Pictureタイプ以外はストリームから読み取らずにスキップする
2828
List<byte> metaData;
2929
if (metaDataType == 6) {
30-
metaData = Helper.ReadAsByteList(stream, (int)metaDataLength);
30+
metaData = stream.ReadAsByteList((int)metaDataLength);
3131
}
3232
else {
3333
metaData = null;
34-
Helper.Skip(stream, (int)metaDataLength);
34+
stream.Skip((int)metaDataLength);
3535
}
3636

3737
return new MetaData((MetaDataType)metaDataType, isLast, metaData);
@@ -45,36 +45,33 @@ private Image _ParsePictureMetaData(MetaData pictureMetaData) {
4545
throw new ArgumentException("このメタデータはPICTUREタイプではありません");
4646

4747
List<byte> imageSource;
48-
using (var memory = new MemoryStream()) {
49-
memory.Write(pictureMetaData.Data.ToArray(), 0, pictureMetaData.Data.Count);
50-
memory.Seek(4, SeekOrigin.Begin);
51-
52-
var mimeTypeLength = Helper.ReadAsUInt(memory);
48+
using (var memory = new MemoryStream(pictureMetaData.Data.ToArray())) {
49+
memory.Skip(4);
50+
var mimeTypeLength = memory.ReadAsUInt();
5351
if (mimeTypeLength > 128)
5452
throw new InvalidDataException("mimeTypeLength が不正な値です");
5553

56-
var explanationLength = Helper.ReadAsUInt(memory, skip: (int)mimeTypeLength);
54+
memory.Skip((int)mimeTypeLength);
55+
var explanationLength = memory.ReadAsUInt();
5756

58-
var imageSourceSize = Helper.ReadAsUInt(memory, skip: (int)explanationLength + 4 * 4);
59-
imageSource = Helper.ReadAsByteList(memory, (int)imageSourceSize);
57+
memory.Skip((int)explanationLength + 4 * 4);
58+
var imageSourceSize = memory.ReadAsUInt();
59+
imageSource = memory.ReadAsByteList((int)imageSourceSize);
6060
}
6161

62-
using (var memory = new MemoryStream()) {
63-
memory.Write(imageSource.ToArray(), 0, imageSource.Count);
64-
62+
using (var memory = new MemoryStream(imageSource.ToArray()))
6563
using (var image = Image.FromStream(memory))
6664
return new Bitmap(image);
67-
}
6865
}
6966

7067
/// <summary>
7168
/// 対象のファイルが形式と一致しているかを判別します
7269
/// </summary>
7370
public bool CheckType(string filePath) {
7471
using (var file = new FileStream(filePath, FileMode.Open, FileAccess.Read)) {
75-
var fileType = Helper.ReadAsAsciiString(file, 4);
72+
var formatId = file.ReadAsAsciiString(4);
7673

77-
if (fileType != "fLaC")
74+
if (formatId != "fLaC")
7875
return false;
7976
}
8077

@@ -101,7 +98,7 @@ public Image Extract(string filePath) {
10198
throw new FileNotFoundException("指定されたファイルは存在しません");
10299

103100
using (var file = new FileStream(filePath, FileMode.Open, FileAccess.Read)) {
104-
Helper.Skip(file, 4);
101+
file.Skip(4);
105102

106103
var metaDataList = new List<MetaData>();
107104
MetaData metaData = null;

AlbumArtExtraction/Helper.cs

-79
This file was deleted.

AlbumArtExtraction/ID3v22AlbumArtExtractor.cs

+8-8
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ private Image _ReadPictureInFrameHeaders(Stream file)
2828
while (count++ < 63)
2929
{
3030
// Frame Name
31-
var frameName = Helper.ReadAsAsciiString(file, 3);
31+
var frameName = file.ReadAsAsciiString(3);
3232

3333
// 有効な Frame Name であるかどうかを示す
3434
var validName = Regex.IsMatch(frameName, "^[A-Z0-9]+$");
@@ -37,20 +37,20 @@ private Image _ReadPictureInFrameHeaders(Stream file)
3737
if (!validName) break;
3838

3939
Debug.WriteLine($"frameName = {frameName}");
40-
var frameSize = Helper.ReadAsUInt(file, 3);
40+
var frameSize = file.ReadAsUInt(3);
4141

4242
// PIC Frame の判定
4343
if (frameName == "PIC")
4444
{
4545
// 1Byte: 文字コード, 3Byte: フォーマット, 1Byte: 種別は必ず存在する為、読み飛ばす
46-
Helper.Skip(file, 5);
46+
file.Skip(5);
4747

4848
// 説明文を読み飛ばす (終端文字含む)
4949
var length = 1;
50-
while ((Helper.ReadAsByte(file) != 0x00U))
50+
while ((file.ReadAsByte() != 0x00U))
5151
length++;
5252

53-
var imageSource = Helper.ReadAsByteList(file, (int)frameSize - (5 + length));
53+
var imageSource = file.ReadAsByteList((int)frameSize - (5 + length));
5454

5555
// byte データを画像として変換する
5656
using (var memory = new MemoryStream())
@@ -63,7 +63,7 @@ private Image _ReadPictureInFrameHeaders(Stream file)
6363
}
6464

6565
// PIC Frame でないため、フレーム自体を読み飛ばす
66-
Helper.Skip(file, (int)frameSize);
66+
file.Skip((int)frameSize);
6767
}
6868

6969
return null;
@@ -79,7 +79,7 @@ private Image _ReadPictureInFrameHeaders(Stream file)
7979
public bool CheckType(string filePath)
8080
{
8181
using (var file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
82-
return (Helper.ReadAsAsciiString(file, 3) == "ID3" && Helper.ReadAsUShort(file) == 0x0200U);
82+
return (file.ReadAsAsciiString(3) == "ID3" && file.ReadAsUShort() == 0x0200U);
8383
}
8484

8585
/// <summary>
@@ -90,7 +90,7 @@ public Image Extract(string filePath)
9090
using (var file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
9191
{
9292
// ID3v2 Header 読み飛ばし
93-
Helper.Skip(file, 10);
93+
file.Skip(10);
9494

9595
// v2.2 に関しては、ID3 Extended Header や、そのフラグは存在しない模様。
9696

AlbumArtExtraction/ID3v2AlbumArtExtractor.cs

+13-13
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ private Image _ReadPictureInFrameHeaders(Stream file)
3030
while (true)
3131
{
3232
// Frame Name
33-
var frameName = Helper.ReadAsAsciiString(file, 4);
33+
var frameName = file.ReadAsAsciiString(4);
3434

3535
// 有効な Frame Name であるかどうかを示す
3636
var validName = Regex.IsMatch(frameName, "^[A-Z0-9]+$");
@@ -39,27 +39,27 @@ private Image _ReadPictureInFrameHeaders(Stream file)
3939
if (!validName) break;
4040

4141
Debug.WriteLine($"frameName = {frameName}");
42-
var frameSize = Helper.ReadAsUInt(file, 4);
42+
var frameSize = file.ReadAsUInt(4);
4343

4444
// フラグ読み飛ばし
45-
Helper.Skip(file, 2);
45+
file.Skip(2);
4646

4747
// APIC Frame の判定
4848
if (frameName == "APIC")
4949
{
5050
var removeCount = 0;
5151

52-
Helper.Skip(file, 1);
52+
file.Skip(1);
5353
removeCount += 1;
5454

55-
while (Helper.ReadAsByte(file) != 0x00U) removeCount++;
55+
while (file.ReadAsByte() != 0x00U) removeCount++;
5656

57-
Helper.Skip(file, 1);
57+
file.Skip(1);
5858
removeCount += 1;
5959

60-
while (Helper.ReadAsByte(file) != 0x00U) removeCount++;
60+
while (file.ReadAsByte() != 0x00U) removeCount++;
6161

62-
var imageSource = Helper.ReadAsByteList(file, (int)frameSize - removeCount);
62+
var imageSource = file.ReadAsByteList((int)frameSize - removeCount);
6363

6464
// byte データを画像として変換する
6565
using (var memory = new MemoryStream())
@@ -71,7 +71,7 @@ private Image _ReadPictureInFrameHeaders(Stream file)
7171
}
7272

7373
// PIC Frame でないため、フレーム自体を読み飛ばす
74-
Helper.Skip(file, (int)frameSize);
74+
file.Skip((int)frameSize);
7575

7676
if (count > 74)
7777
throw new InvalidDataException("フレーム数が正常な範囲を超えました");
@@ -93,9 +93,9 @@ public bool CheckType(string filePath)
9393
{
9494
using (var file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
9595
{
96-
var formatId = Helper.ReadAsAsciiString(file, 3);
97-
var version = Helper.ReadAsUShort(file);
98-
var headerFlag = Helper.ReadAsByte(file);
96+
var formatId = file.ReadAsAsciiString(3);
97+
var version = file.ReadAsUShort();
98+
var headerFlag = file.ReadAsByte();
9999

100100
// フォーマット判定
101101
if (!(formatId == "ID3" && (version == 0x0300U || version == 0x0400U)))
@@ -114,7 +114,7 @@ public Image Extract(string filePath)
114114
using (var file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
115115
{
116116
// ID3v2 Header 読み飛ばし
117-
Helper.Skip(file, 10);
117+
file.Skip(10);
118118

119119
// Frame Headers
120120
return _ReadPictureInFrameHeaders(file);
+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Text;
6+
7+
namespace AlbumArtExtraction
8+
{
9+
public static class StreamExtensions
10+
{
11+
/// <summary>
12+
/// 指定したバイト数のデータを読み飛ばします
13+
/// </summary>
14+
/// <param name="skip">読み飛ばすバイト数</param>
15+
public static void Skip(this Stream stream, int skip)
16+
{
17+
if (skip > 0)
18+
stream.Seek(skip, SeekOrigin.Current);
19+
}
20+
21+
/// <summary>
22+
/// 指定した長さのデータを List&lt;byte&gt; として読み取ります
23+
/// </summary>
24+
/// <param name="count">読み取るデータの長さ(バイト数)</param>
25+
public static List<byte> ReadAsByteList(this Stream stream, int count)
26+
{
27+
var buf = new byte[count];
28+
stream.Read(buf, 0, count);
29+
30+
return new List<byte>(buf);
31+
}
32+
33+
/// <summary>
34+
/// byte(1 Bytes) として読み取ります
35+
/// </summary>
36+
public static byte ReadAsByte(this Stream stream) =>
37+
stream.ReadAsByteList(1)[0];
38+
39+
private static byte[] _ReadAsUIntXBase(this Stream stream, int returnSize, int count)
40+
{
41+
if (count < 1 || count > returnSize)
42+
throw new ArgumentOutOfRangeException("count");
43+
44+
var buf = stream.ReadAsByteList(count);
45+
46+
// 配列にゼロパディングを追加
47+
foreach (var i in Enumerable.Range(0, returnSize - count))
48+
buf.Insert(0, 0);
49+
50+
buf.Reverse();
51+
52+
return buf.ToArray();
53+
}
54+
55+
/// <summary>
56+
/// 指定した長さのデータを ushort(2 Bytes) として読み取ります(ビッグエンディアン)
57+
/// </summary>
58+
/// <param name="count">読み取るデータの長さ(バイト数) 範囲: 1-2</param>
59+
/// <exception cref="ArgumentOutOfRangeException" />
60+
public static ushort ReadAsUShort(this Stream stream, int count = 2) =>
61+
BitConverter.ToUInt16(stream._ReadAsUIntXBase(2, count), 0);
62+
63+
/// <summary>
64+
/// 指定した長さのデータを uint(4 Bytes) として読み取ります(ビッグエンディアン)
65+
/// </summary>
66+
/// <param name="count">読み取るデータの長さ(バイト数) 範囲: 1-4</param>
67+
/// <exception cref="ArgumentOutOfRangeException" />
68+
public static uint ReadAsUInt(this Stream stream, int count = 4) =>
69+
BitConverter.ToUInt32(stream._ReadAsUIntXBase(4, count), 0);
70+
71+
/// <summary>
72+
/// ASCII文字列として指定されたカウント数だけ読み取ります
73+
/// </summary>
74+
public static string ReadAsAsciiString(this Stream stream, int count)
75+
{
76+
var bytes = stream.ReadAsByteList(count).ToArray();
77+
78+
return new string(Encoding.ASCII.GetChars(bytes));
79+
}
80+
}
81+
}

0 commit comments

Comments
 (0)