C# :: Aufgabe #220 :: Lösung #2

2 Lösungen Lösungen öffentlich
#220

Lesen und Bearbeiten von MP3-Dateien

Anfänger - C# von Exception - 14.07.2018 um 08:28 Uhr
Hallo zusammen,

heute sollt ihr Informationen aus MP3-Dateien lesen und editieren.

Dafür sollt ihr eine Windows Forms Anwendung schreiben,
in der ihr per Klick auf einen Button eine MP3-Datei einlesen und nach der Bearbeitung wieder speichern könnt.

Die folgenden Informationen sollen ausgelesen werden:
- Titel des Stücks (30)
- Interpret (30)
- Album / CD-Titel (30)
- Erscheinungsjahr (4)
- Kommentar (30)
- Genre (1)

Diese Informationen ("ID3-Tags") liegen als Zeichenketten in den letzten 125 Byte der Datei.
Die in der Klammer stehende Zahl zeigt an, wieviel Byte für die entsprechende Information belegt sind.

Doch zuvor muss geprüft werden ob die Datei auch wirklich eine gültige MP3-Datei ist.
Diese Information beginnt im 128. Byte und ist insg. 3 Byte lang.
(D.h., dass der komplette ID3-Tag 128 Byte lang ist)
In diesen 3 Byte muss "TAG" stehen (= TAG-Identifizierung), wenn nicht wird eine Exception o.ä. geworfen - ist euer Bier.
(Sicherlich kann es vorkommen, dass bei einer anderen Datei, genau an dieser Stelle ebenfalls "TAG" steht, aber für die Einfachkeit belassen wir es hierbei)

Wenn die Datei eingelesen ist und z.B. in Textboxen die Informationen ausgegeben wurden können diese bearbeitet werden und mit einem anderen Button gesichert / geschrieben werden.


Viel Spaß! :)


Hilfe / Nützliches:
- BinaryReader
- BinaryWriter
#2
vote_ok
von k4zz (50 Punkte) - 11.08.2018 um 13:07 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace mp3tagedit
{
    public partial class Mp3tagedit : Form
    {
        public string filename { get; set; }
        public Mp3tagedit()
        {
            InitializeComponent();
            var names = Enum.GetNames(typeof(Genre)).ToList();
            names.Sort();
            CmbGenre.Items.AddRange(names.ToArray());
        }

        private void BtnOpenFile_Click(object sender, EventArgs e)
        {
            CmbGenre.Text = "";
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "MP3|*.mp3";
            openFileDialog.Title = "MP3 Datei auswählen";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                filename = openFileDialog.FileName;
                Refresh(filename);
            }
        }

        private void BtnSave_Click(object sender, EventArgs e)
        {
            var tag = Encoding.Default.GetBytes("TAG").ToList();
            tag.AddRange(FillBytes(Encoding.Default.GetBytes(TxtTitle.Text).ToList(), 30));
            tag.AddRange(FillBytes(Encoding.Default.GetBytes(TxtInterpret.Text).ToList(), 30));
            tag.AddRange(FillBytes(Encoding.Default.GetBytes(TxtAlbum.Text).ToList(), 30));
            tag.AddRange(FillBytes(Encoding.Default.GetBytes(TxtYear.Text).ToList(), 4));
            tag.AddRange(FillBytes(Encoding.Default.GetBytes(TxtComments.Text).ToList(), 30));
            if (!string.IsNullOrEmpty(CmbGenre.Text))
            {
                Genre genre = (Genre)Enum.Parse(typeof(Genre), CmbGenre.Text.Replace(" ", "_"));
                tag.Add((byte)genre);
            }
            else
            {
                tag.Add((byte)Genre.UNKNOWN);
            }
            BinaryWriter binaryWriter = new BinaryWriter(File.Open(filename, FileMode.Open));
            var id3tag = tag.ToArray();
            binaryWriter.BaseStream.Position = binaryWriter.BaseStream.Length - 128;
            binaryWriter.BaseStream.Write(id3tag, 0, id3tag.Length);
            binaryWriter.Close();
            Refresh(filename);
        }

        private void Refresh(string filename)
        {
            CmbGenre.Text = "";
            BinaryReader binaryReader = new BinaryReader(File.Open(filename,FileMode.Open));
            binaryReader.BaseStream.Position = binaryReader.BaseStream.Length - 128;
            var data = Encoding.Default.GetChars(binaryReader.ReadBytes(128)).ToList();
            binaryReader.Close();
            string tag = string.Empty;
            for (int i = 0; i < 3; i++)
            {
                tag += data[i];

            }
            if (tag != "TAG")
            {
                throw new Exception();
            }
            data.RemoveRange(0, 3);
            TxtTitle.Text = Read(ref data, 30);
            TxtInterpret.Text = Read(ref data, 30);
            TxtAlbum.Text = Read(ref data, 30);
            TxtYear.Text = Read(ref data, 4);
            TxtComments.Text = Read(ref data, 30);
            Genre genre = (Genre)Enum.Parse(typeof(Genre),
                Enum.GetName(
                    typeof(Genre), Convert.ToByte(
                        Convert.ToChar(Read(ref data, 1))
                        )
                    )
                );
            CmbGenre.SelectedText = genre.ToString().Replace("_", " ");
        }

        private List<byte> FillBytes(List<byte> data, int range)
        {
            while (data.Count < range)
            {
                data.Add(0);
            }
            return data;
        }

        private string Read(ref List<char> data, int range)
        {
            var text = string.Empty;
            for (int i = 0; i < range; i++)
            {
                text += data[i];
            }
            data.RemoveRange(0, range);

            return text;
        }

        private void BtnQuit_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
2096849

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.