File size: 3,954 Bytes
1190db4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
from pydub import AudioSegment
import os

def merge_mp3_files(file_paths, output_filename, pause_ms=500):
    """
    Merges multiple MP3 files into a single MP3 file with a specified pause
    between each segment.
    """
    if not file_paths:
        return None

    combined = AudioSegment.empty()
    pause_segment = AudioSegment.silent(duration=pause_ms) if pause_ms > 0 else AudioSegment.empty()

    for i, file_path in enumerate(file_paths):
        if not os.path.exists(file_path) or os.path.getsize(file_path) == 0:
            print(f"Warning: File {file_path} is missing or empty. Skipping.")
            continue
        try:
            segment = AudioSegment.from_mp3(file_path)
            combined += segment
            if i < len(file_paths) - 1: # Don't add pause after the last segment
                combined += pause_segment
        except Exception as e:
            print(f"Error processing file {file_path}: {e}. Skipping.")
            continue
    
    if len(combined) == 0:
        print("No valid audio segments found to merge.")
        return None

    try:
        combined.export(output_filename, format="mp3")
        return output_filename
    except Exception as e:
        print(f"Error exporting merged MP3 to {output_filename}: {e}")
        return None

if __name__ == '__main__':
    # Create dummy mp3 files for testing (requires ffmpeg to be installed and pydub)
    # This test assumes you have some small MP3s or can generate them.
    # For a self-contained test, you might need to generate silent MP3s.
    
    print("This script is intended to be used as a module.")
    print("To test, ensure you have some MP3 files and call merge_mp3_files directly.")
    # Example:
    # create_dummy_mp3("dummy1.mp3", duration_ms=1000)
    # create_dummy_mp3("dummy2.mp3", duration_ms=1500)
    # merge_mp3_files(["dummy1.mp3", "dummy2.mp3"], "merged_output.mp3", pause_ms=200)
    # os.remove("dummy1.mp3")
    # os.remove("dummy2.mp3")
    # os.remove("merged_output.mp3")

    # Helper to create dummy files if needed for a more robust test
    def create_dummy_mp3(filename, duration_ms=1000):
        try:
            silence = AudioSegment.silent(duration=duration_ms)
            silence.export(filename, format="mp3")
            print(f"Created dummy file: {filename}")
        except Exception as e:
            print(f"Could not create dummy MP3 {filename}. Ensure ffmpeg is installed and accessible. Error: {e}")


    # Create dummy files for testing
    dummy_files_exist = True
    try:
        create_dummy_mp3("test_dummy1.mp3", 1000)
        create_dummy_mp3("test_dummy2.mp3", 1500)
    except Exception:
        dummy_files_exist = False
        print("Skipping merge test as dummy files could not be created (ffmpeg issue?).")

    if dummy_files_exist:
        print("\nTesting merge_mp3_files...")
        files_to_merge = ["test_dummy1.mp3", "test_dummy2.mp3", "non_existent_file.mp3"]
        output_merged = "test_merged_audio.mp3"
        
        result_path = merge_mp3_files(files_to_merge, output_merged, pause_ms=300)
        if result_path and os.path.exists(result_path):
            print(f"Successfully merged audio to: {result_path}")
            # Simple check: merged file should be larger than individual (roughly)
            merged_size = os.path.getsize(result_path)
            dummy1_size = os.path.getsize("test_dummy1.mp3")
            print(f"Size of {result_path}: {merged_size} bytes (dummy1 was {dummy1_size})")
            if merged_size > dummy1_size : # crude check
                 print("Merge test seems OK.")
            else:
                 print("Merged file size issue.")
            os.remove(result_path)
        else:
            print("Failed to merge audio.")

        # Clean up dummy files
        if os.path.exists("test_dummy1.mp3"): os.remove("test_dummy1.mp3")
        if os.path.exists("test_dummy2.mp3"): os.remove("test_dummy2.mp3")